OpenGL代码学习(3)

#include <iostream>
#include <GLUT/GLUT.h>
#include "math3d.h"

// 绘制五角星
void draw4() {
    const GLfloat Pi = 3.1415926536f;
    GLfloat a = 1 / (2-2*cos(72*Pi/180));
    GLfloat bx = a * cos(18 * Pi/180);
    GLfloat by = a * sin(18 * Pi/180);
    GLfloat cy = -a * cos(18 * Pi/180);
    GLfloat
    PointA[2] = { 0, a },
    PointB[2] = { bx, by },
    PointC[2] = { 0.5, cy },
    PointD[2] = { -0.5, cy },
    PointE[2] = { -bx, by };

    glClear(GL_COLOR_BUFFER_BIT);
    // 按照A->C->E->B->D->A的顺序,可以一笔将五角星画出
    glBegin(GL_LINE_LOOP);
    glVertex2fv(PointA);
    glVertex2fv(PointC);
    glVertex2fv(PointE);
    glVertex2fv(PointB);
    glVertex2fv(PointD);
    glEnd();
    glFlush();
}


// 绘制圆 (这样画出来的竟然是个椭圆)
void draw3() {
    glClearColor(0.f, 0.f, 0.f, 0.f);
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1.f, 0.f, 0.f);
    glBegin(GL_POLYGON);
    
    const int n = 10;
    const  GLfloat R = 0.5f;
    const GLfloat pi = 3.1415926f;
    for (int i = 0; i < n; i++) {
        glVertex2f(R*cos(2 * pi / n * i), R * sin(2 * pi / n * i));
    }
    glEnd();//结束渲染
    glFlush();//强制刷新缓存区,保证绘制命令得以执行
}

// 绘制正方形
void draw2() {
    
    // 设置清屏颜色 红、绿、蓝、透明度
    /*
    在Windows中 颜色成分取值范围 0~255之间
    在iOS、OS c颜色成分取值范围 0~1之间浮点数
    */
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    
    /*
     清除缓存区对数值进行预置
     参数:指定将要清楚的缓存区的遮罩的按位或运算。
     GL_COLOR_BUFFER_BIT: 指示当前激活的用来进行颜色写入缓存区
     GL_DEPTH_BUFFER_BIT:指示深度缓存区
     GL_STENCIL_BUFFER_BIT:指示模板缓存区

     每个缓存区的清楚值根据这个缓存区的清楚值设置不同。

     错误:
     如果设定不是以上三个参考值,返回GL_INVALID_VALUE
     */
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);
    
    /* 设置颜色 */
    glColor3f(1.0f, 0.0f, 0.0f);
    
    /* 设置绘图时的坐标系统 左、右、上、下、近、远 */
    glOrtho(0.0f, 1.0f, 0.0f, 1.0f, -1.0f, 1.0f);
    
    /* 开始渲染 */
    glBegin(GL_POLYGON);
    
    /* 设置多边形的4个顶点 */
    glVertex3f(0.25f, 0.25f, 0.0f);
    glVertex3f(0.75f, 0.25f, 0.0f);
    glVertex3f(0.75f, 0.75f, 0.0f);
    glVertex3f(0.25f, 0.75f, 0.0f);
    
    /* 效果一样
    glVertex2f(0.25f, 0.25f);
    glVertex2f(0.75f, 0.25f);
    glVertex2f(0.75f, 0.75f);
    glVertex2f(0.25f, 0.75f);
     */
    
    /* 结束渲染 */
    glEnd();
    
    /* 强制刷新缓存区,保证绘制命令得以执行 */
    glFlush();
}

// 绘制正弦函数
void draw1() {
    const GLfloat factor = 0.1f;
    GLfloat x;
    glClear(GL_COLOR_BUFFER_BIT);
    glBegin(GL_LINES);
    glVertex2f(-1.f, 0.f);
    glVertex2f(1.f, 0.f);
    glVertex2f(0.f, -1.f);
    glVertex2f(0.f, 1.f);
    glEnd();
    
    glBegin(GL_LINE_STRIP);
    for (x = -1.f/factor; x < 1.f/factor; x += 0.01f) {
        glVertex2f(x * factor, sin(x) * factor);
    }
    glEnd();
    glFlush();
}

int main(int argc, const char *argv[]) {
    
    // 1 初始化一个GLUT库
    glutInit(&argc, (char **)argv);
    
    // 2 创建一个窗口并制定窗口名
    glutInitWindowSize(717, 717);
    glutCreateWindow("OpenGLTest003");
    
    // 3 注册一个绘图函数,操作系统在必要时刻就会对窗体进行重绘制操作
    // 它设置了一个显示回调(diplay callback),即GLUT在每次更新窗口内容的时候会自动调用该例程
    glutDisplayFunc(draw4);
    
    // 这是一个无限执行的循环,它会负责一直处理窗口和操作系统的用户输入等操作。(注意:不会执行在glutMainLoop()之后的所有命令)
    glutMainLoop();
    
    return 0;
}

 

posted @ 2021-04-21 15:00  码出境界  阅读(133)  评论(0编辑  收藏  举报