美文网首页
OpenGL 图元的渲染-矩阵堆栈

OpenGL 图元的渲染-矩阵堆栈

作者: 思路不美 | 来源:发表于2020-07-28 10:49 被阅读0次

之前的创建文章都是用MarkDown编辑器 没想到最近创建的都是富文本编辑器,也没有发布更新看下效果 结果现在要把文章都重新发布一边 惆怅

图元基本连接方式

OpenGL 基本图元连接方式
图元连接方式
GL_TRIANGLE_STRIP优点:
  • 用前3个顶点指定第1个三角形之后,接下来的每⼀个三⻆形,只需要再指定1个顶点。需要绘制⼤量的三⻆形时,采⽤这种⽅法可以节省⼤大量的程序代码和数据存储空间。
  • 提供运算性能和节省带宽。更少的顶点意味着数据从内存传输到图形卡的速度更快,并且顶点着⾊器需要处理的次数也更少
OpenGL三⻆形环绕⽅式

-在默认情况下,OpenGL认为具有逆时针⽅向环绕的多边形为正⾯。

GL_CW: 顺时针环绕的多边形为正⾯
GL_CCW:逆时针环绕的多边形为正⾯
// 手动指定那个面为正面,一般不做修改
glFrontFace(GL_CW);

矩阵堆栈

矩阵堆栈指的就是内存中专门用来存放矩阵数据的某块特殊区域。
一般说来,矩阵堆栈常用于构造具有继承性的模型,即由一些简单目标构成的复杂模型。矩阵堆栈对复杂模型运动过程中的多个变换操作之间的联系与独立十分有利。

  • 堆栈的特点是先进后出,堆栈的默认深度是64
  • 默认值为单元矩阵即与其相乘值并不会发生变化
初始化

modelViewMatrix.LoadIdentity();

压栈

压栈即为存储一个状态

//modelViewMatrix在初始化时,初始化了一个单元矩阵,此时的压栈就是将栈顶的矩阵复制一个,然后压入栈顶
modelViewMatrix.PushMatrix()
矩阵相乘

当前矩阵乘以栈顶矩阵,结果存储到矩阵堆栈顶部

//我们使用栈顶的单元矩阵与观察者矩阵相乘,此时得到的结果是观察者矩阵,并存放到栈顶。
modelViewMatrix.MultMatrix(mCamera)

//然后再使用刚刚得到的观察者矩阵与物体矩阵相乘,得到结果存放到栈顶。
modelViewMatrix.MultMatrix(mObjectFrame

出栈

出栈会将当前栈顶矩阵推出,一般都是一个压栈对应一个出诊,例如当结束旋转状态时,需要恢复到之前状态就进行出栈操作

//出栈
modelViewMatrix.PopMatrix()
获取栈顶的矩阵
modelViewMatrix.GetMatrix()

案例分析

  • 本次键位操作图形旋转使用矩阵操作,每个顶点与旋转矩阵相乘得到旋转后的顶点坐标,不用像上个案例正方形移动一样每操作一次自己计算一次坐标
// 召唤场景
void RenderScene(void)
{
    // Clear the window with current clearing color
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
   
    //压栈
    modelViewMatrix.PushMatrix();
    M3DMatrix44f mCamera;
    cameraFrame.GetCameraMatrix(mCamera);
    
    //矩阵乘以矩阵堆栈的顶部矩阵,相乘的结果随后简存储在堆栈的顶部
    modelViewMatrix.MultMatrix(mCamera);
    
    M3DMatrix44f mObjectFrame;
    //只要使用 GetMatrix 函数就可以获取矩阵堆栈顶部的值,这个函数可以进行2次重载。用来使用GLShaderManager 的使用。或者是获取顶部矩阵的顶点副本数据
    objectFrame.GetMatrix(mObjectFrame);
    
    //矩阵乘以矩阵堆栈的顶部矩阵,相乘的结果随后简存储在堆栈的顶部
    modelViewMatrix.MultMatrix(mObjectFrame);
    
    /* GLShaderManager 中的Uniform 值——平面着色器
     参数1:平面着色器
     参数2:运行为几何图形变换指定一个 4 * 4变换矩阵
     --transformPipeline.GetModelViewProjectionMatrix() 获取的
     GetMatrix函数就可以获得矩阵堆栈顶部的值
     参数3:颜色值(黑色)
     */
    shaderManager.UseStockShader(GLT_SHADER_FLAT, transformPipeline.GetModelViewProjectionMatrix(), vBlack);
    
    switch(nStep) {
        case 0:
            //设置点的大小
            glPointSize(4.0f);
            pointBatch.Draw();
            glPointSize(1.0f);
            break;
        case 1:
            //设置线的宽度
            glLineWidth(2.0f);
            lineBatch.Draw();
            glLineWidth(1.0f);
            break;
        case 2:
            glLineWidth(2.0f);
            lineStripBatch.Draw();
            glLineWidth(1.0f);
            break;
        case 3:
            glLineWidth(2.0f);
            lineLoopBatch.Draw();
            glLineWidth(1.0f);
            break;
        case 4:
            DrawWireFramedBatch(&triangleBatch);
            break;
        case 5:
            DrawWireFramedBatch(&triangleStripBatch);
            break;
        case 6:
            DrawWireFramedBatch(&triangleFanBatch);
            break;
    }
    
    //还原到以前的模型视图矩阵(单位矩阵)
    modelViewMatrix.PopMatrix();
    
    // 进行缓冲区交换
    glutSwapBuffers();
}

Demo

相关文章

  • OpenGL 图元的渲染-矩阵堆栈

    之前的创建文章都是用MarkDown编辑器 没想到最近创建的都是富文本编辑器,也没有发布更新看下效果 结果现在要...

  • 离屏渲染与OpenGL渲染结构

    大纲 理解离屏渲染 OpenGL渲染结构 着色器 OpenGL 基础图元/基本图元连接 理解离屏渲染 正常渲染流程...

  • OpenGL矩阵堆栈处理

    为什么要使用矩阵堆栈? OpenGL在进行渲染的时候是通过模型视图矩阵和投影矩阵运算得到最终显示的坐标。 模型矩阵...

  • OpenGL-基础渲染

    目录 OpenGL渲染架构 投影方式设置 固定管线解析 OpenGL基本图元解析 图元绘制 GLBatch Ope...

  • OpenGL的绘制

    OpenGL渲染图像 OpenGL渲染图像需要执行的操作从OpenGL的几何图元中设置数据,用于构建形状。使用不同...

  • OpenGL学习之路(5.3) 矩阵堆栈的了解和使用方法

    什么是矩阵堆栈? OpenGL的矩阵堆栈指的就是内存中专门用来存放矩阵数据的某块特殊区域。一般说来,矩阵堆栈常用于...

  • OpenGL渲染流程和矩阵堆栈

      想要更深入的学习OpenGL,就要先了解OpenGL渲染架构图(如下图)。客户端和OpenGL渲染服务严格遵循...

  • 简述OpenGL渲染架构流程、固定着色器、图元

    开场白 本文介绍内容 OpenGL渲染架构流程 OpenGL固定着色器 OpenGL基本图元连接方式 OpenGL...

  • 使⽤固定存储着⾊器渲染多种图元

    OpenGL下的图形都是由图元构成的,图元告诉了所有顶点以何种方式去绘制渲染。主要有以下7种图元: 图元描述GL_...

  • OpenGL矩阵堆栈

    OpenGL的矩阵堆栈指的就是内存中专门用来存放矩阵数据的某块特殊区域。一般说来,矩阵堆栈常用于构造具有继承性的模...

网友评论

      本文标题:OpenGL 图元的渲染-矩阵堆栈

      本文链接:https://www.haomeiwen.com/subject/sbtfrktx.html