OpenGL | 利用OpenGL 绘制不同的三角形

一、搭建OpenGL 画画框架

1.3D场景初始化

(1) 代码

void Init()
{
    glMatrixMode(GL_PROJECTION);     //将当前矩阵指定为投影矩阵,对投影矩阵操作
    gluPerspective(50.0f, 800.0f / 600.0f, 0.1f, 1000.0f);//创建一个对称的透视投影矩阵,并且用这个矩阵乘以当前矩阵
    glMatrixMode(GL_MODELVIEW);      //将当前矩阵指定为模型视图矩阵,对模型视图矩阵操作
    glLoadIdentity();                //把矩阵设为单位矩阵
}

(2)相关函数介绍

a. glMatrixMode 指定矩阵模式

glMatrixMode()命令将当前矩阵设置成参数所指定的模式,以满足不同绘图所需执行的矩阵变换。一般而言:

  • 在需要绘制出对象或要对所绘制对象进行几何变换时,需要将变换矩阵设置成模型视图模式;

  • 而当需要对绘制的对象设置某种投影方式时,则需要将变换矩阵设置成投影模式;

  • 只有在进行纹理映射时,才需要将变换矩阵设置成纹理模式。

与glLoadIdentity()一同使用,glLoadIdentity()功能是重置当前指定的矩阵为单位矩阵。

void glMatrixMode(GLenum mode)

mode 指定哪一个矩阵堆栈是下一个矩阵操作的目标,可选值: 

  • GL_MODELVIEW:对模型视图矩阵堆栈应用随后的矩阵操作。可以在执行此命令后,输出自己的物体图形了。

  • GL_PROJECTION:对投影矩阵堆栈应用随后的矩阵操作。可以在执行此命令后,为我们的场景增加透视。

  • GL_TEXTURE:对纹理矩阵堆栈应用随后的矩阵操作。可以在执行此命令后,为我们的图形增加纹理贴图。

b. gluPerspective 创建透视投影矩阵

OpenGL支持两种类型的投影变换,即透视投影和正交投影。

void gluPerspective(GLdouble fovy,GLdouble aspect,GLdouble zNear, GLdouble zFar);

创建一个对称的透视投影矩阵,并且用这个矩阵乘以当前矩阵。

  • 参数fovy定义视野在Y-Z平面的角度,范围是[0.0, 180.0];

  • 参数aspect是投影平面宽度与高度的比率;

  • 参数Near和Far分别是近远裁剪面到视点(沿Z负轴)的距离,它们总为正值。

2. 绘制一个独立的三角形

将每个三元顶点视为独立的三角形。 顶点 3n - 2、 3n - 1 和 3n 定义三角形 n。 绘制 N/3 个三角形。

(1)代码

void Draw()
{
    glClearColor(1, 1, 1, 1.0f);  //白色背景
    glClear(GL_COLOR_BUFFER_BIT);

    glBegin(GL_TRIANGLES);        //注意是逆时针绘制(CCW),可以通过   glFrontFace(GL_CW); 改成顺时针绘制
    glColor4ub(0, 0, 255, 255);   //蓝
    glVertex3f(-0.2f, -0.2f, -1.5f);
    
    glColor4ub(255, 0, 0, 255);   //红
    glVertex3f(0.2f, -0.2f, -1.5f);

    glColor4ub(0, 255, 0, 255);   //绿
    glVertex3f(0.0f, 0.2f, -1.5f);
    glEnd();
}

注意:绘制完成三角形之后,需要SwapBuffers交换缓冲区,否则画面绘制不出三角形。

//... 
//防止窗口一闪而过
    MSG msg;
    while (true)
    {
        if (PeekMessage(&msg, NULL, NULL, NULL, PM_REMOVE))
        {
            if (msg.message == WM_QUIT)
            {
                break;
            }
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        //实时绘制
        Draw();
        SwapBuffers(dc);    //交换缓冲区
    }
//...

(2)绘制效果

默认情况下 OpenGL 会绘制正面及背面两面。 点的正面方向是逆时针方向的 , 因此绘制的时候 , 默认是逆时针绘制 , 即第一个点连接第二个点 , 第二个点连接第三个点 , 第三个点连接第一个点 , 这样绘制。

正面就是摄像机对着的那一面,即:我们人眼看时呈逆时针绘制的那一面。

绘制三角形面时 , 在 glBegin 方法中传入 GL_TRIANGLES 参数 , 然后在 glBegin 和 glEnd 之间设置多个点 , OpenGL 会自动将三个点组成一个三角形面 , 绘制出来 。其中每个点都可以设置一个颜色值 , 面上的颜色都是通过三个点的颜色差值出来的。

(3)相关函数介绍

a. glClearColor

指定刷新颜色缓冲区时所用的颜色。注意:glClearColor只起到Set的作用,并不Clear。所以要和glClear联合使用。

b. glClear

清除缓冲区颜色,并设置为预设值。有四个参数:

GL_COLOR_BUFFER_BIT

当前为颜色写入启用的缓冲区。

GL_DEPTH_BUFFER_BIT

深度缓冲区。

GL_ACCUM_BUFFER_BIT

累积缓冲区。

GL_STENCIL_BUFFER_BIT

模具缓冲区。

3.绘制一个连接的三角形(条状)

绘制一组连接的三角形。 为前两个顶点之后呈现的每个顶点定义一个三角形。 对于奇数 n、顶点 n、 n + 1 和 n + 2 定义三角形 n。 对于偶数 n,顶点 n + 1、 n 和 n + 2 定义三角形 n。 绘制 N - 2 个三角形。

(1)代码

void Draw()
{
    glClearColor(1, 1, 1, 1.0f);  //白色背景
    glClear(GL_COLOR_BUFFER_BIT);

    //绘制连接的三角形
    glBegin(GL_TRIANGLE_STRIP);
    glColor4ub(0, 0, 255, 255);   //蓝
    glVertex3f(-0.2f, -0.2f, -1.5f);

    glColor4ub(255, 0, 0, 255);   //红
    glVertex3f(0.2f, -0.2f, -1.5f);

    glColor4ub(0, 255, 0, 255);   //绿
    glVertex3f(0.0f, 0.2f, -1.5f);

    glColor4ub(0, 255, 255, 255); //青
    glVertex3f(0.4f, 0.2f, -1.5f);

    glEnd();
}

(2)绘制效果

4.绘制一个连接的三角形(扇形)

(1)代码

void Draw()
{
    glClearColor(1, 1, 1, 1.0f);  //白色背景
    glClear(GL_COLOR_BUFFER_BIT);

    //绘制连接的三角形
    glBegin(GL_TRIANGLE_FAN);
    glColor4ub(255, 255, 0, 255);     //黄
    glVertex3f(-0.2f, 0, -1.5f);

    glColor4ub(0, 255, 255, 255);     //青
    glVertex3f(0.4f, 0, -1.5f);

    glColor4ub(255, 0, 0, 255);       //红
    glVertex3f(0.4f, 0.2f, -1.5f);

    glColor4ub(0, 255, 0, 255);       //绿
    glVertex3f(0.3f, 0.34f, -1.5f);

    glColor4ub(255, 0, 255, 255);     //粉
    glVertex3f(0.13f, 0.4f, -1.5f);

    glEnd();
}

(2)绘制效果

5.参考文档

猜你喜欢

转载自blog.csdn.net/weixin_39766005/article/details/128814152
今日推荐