美文网首页OpenGL
OpenGL渲染流程和矩阵堆栈

OpenGL渲染流程和矩阵堆栈

作者: 爱看书de图图 | 来源:发表于2020-07-09 16:35 被阅读0次

      想要更深入的学习OpenGL,就要先了解OpenGL渲染架构图(如下图)。客户端和OpenGL渲染服务严格遵循下图,不能更改,比如Attributes(ins)只能作用于顶点着色器,来间接的影响片元着色器,但是不能作用于片元着色器。

    OpenGL渲染架构图.jpeg
      由于OpenGL是基于CAPI,因此它⾮常便携且受到⼴泛⽀持。作为C API,它与基于Objective-CCocoa应⽤程序⽆缝集成。OpenGL提供应⽤程序⽤于⽣成2D3D图像的函数。您的应⽤程序将渲染的图像呈现给屏幕或将它们复制回⾃⼰的内存。OpenGL规范没有提供⾃⼰的窗⼝层。它依赖于OS X定义的功能来将OpenGL绘图与窗⼝系统集成。您的应⽤程序创建OS X OpenGL 渲染上下⽂并将渲染⽬标附加到其上(称为可绘制对象)。渲染上下⽂管理OpenGL状态更改和通过调⽤OpenGL API创建的对象。
      OpenGL固定存储着色器有,单元着色器,平面着色器,上色着色器,默认光源着色器,点光源着色器,纹理替换矩阵着色器,纹理调整着色器,纹理光源着色器,这些着色器都不可以编程。
    1、单元着色器
    GLShaderManager::UserStockShader(GLT_SHADER_IDENTITY,GLfloat vColor[4]);
    参数1: 存储着⾊器种类-单元着⾊器
    参数2: 颜⾊
    

    2、平面着色器

    GLShaderManager::UserStockShader(GLT_SHADER_FLAT,GLfloat mvp[16],GLfloat vColor[4]);
    参数1: 存储着⾊器种类-平⾯着⾊器
    参数2: 允许变化的4*4矩阵
    参数3: 颜⾊
    

    3、上色着色器

    GLShaderManager::UserStockShader(GLT_SHADER_SHADED,GLfloat mvp[16]);
    参数1: 存储着⾊器种类-上⾊着⾊器
    参数2: 允许变化的4*4矩阵
    

    4、默认光源着色器

    GLShaderManager::UserStockShader(GLT_SHADER_DEFAULT_LIGHT,GLfloat
    mvMatrix[16],GLfloat pMatrix[16],GLfloat vColor[4]);
    参数1: 存储着⾊器种类-默认光源着⾊器
    参数2: 模型4*4矩阵
    参数3: 投影4*4矩阵
    参数4: 颜⾊值
    

    5、点光源着色器

    GLShaderManager::UserStockShader(GLT_SHADER_POINT_LIGHT_DIEF,GLfloat 
    mvMatrix[16],GLfloat pMatrix[16],GLfloat vLightPos[3],GLfloat vColor[4]); 
    参数1: 存储着⾊器种类-点光源着⾊器
    参数2: 模型4*4矩阵
    参数3: 投影4*4矩阵
    参数4: 点光源的位置
    参数5: 颜⾊值
    

    6、纹理替换矩阵着色器

    GLShaderManager::UserStockShader(GLT_SHADER_TEXTURE_REPLACE,GLfloat 
    mvMatrix[16],GLint nTextureUnit);
    参数1: 存储着⾊器种类-纹理替换矩阵着⾊器
    参数2: 模型4*4矩阵
    参数3: 纹理单元
    

    7、纹理调整着色器

    GLShaderManager::UserStockShader(GLT_SHADER_TEXTURE_MODULATE,GLfloat 
    mvMatrix[16],GLfloat vColor[4],GLint nTextureUnit);
    参数1: 存储着⾊器种类-纹理调整着⾊器
    参数2: 模型4*4矩阵
    参数3: 颜⾊值
    参数4: 纹理单元
    

    8、纹理光源着色器

    GLShaderManager::UserStockShader(GLT_SHADER_TEXTURE_POINT_LIGHT_DIEF,G
    Lfloat mvMatrix[16],GLfloat pMatrix[16],GLfloat vLightPos[3],GLfloat vBaseColor[4],GLint nTextureUnit);
    参数1: 存储着⾊器种类-纹理光源着⾊器
    参数2: 模型4*4矩阵
    参数3: 投影4*4矩阵
    参数4: 点光源位置
    参数5: 颜⾊值(⼏何图形的基本⾊) 
    参数6: 纹理单元
    

      OpenGL基本的图元链接方式参数,以及对应的图像(下图)。后面我用实际的案例,来一次使用这些图元来绘图。

    图元 描述
    GL_POINTS 每个顶点在屏幕上都是单独点
    GL_LINES 每⼀对顶点定义⼀个线段
    GL_LINE_STRIP 一个从第⼀个顶点依次经过每⼀个后续顶点而绘制的线条
    GL_LINE_LOOP 和GL_LINE_STRIP相同,但是最后⼀个顶点和第⼀个顶点连接起来了
    GL_TRIANGLES 每3个顶点定义⼀个新的三角形
    GL_TRIANGLE_STRIP 共⽤一个条带(strip)上的顶点的一组三⻆形
    GL_TRIANGLE_FAN 以⼀个圆点为中⼼呈扇形排列,共⽤相邻顶点的⼀组三⻆形
    image.png
    头文件

      其中比较之前多的为,GLMatrixStack.h,GLFrame.h,GLFrustum.h为矩阵工具类,GLGeometryTransform.h为变换管道类,用来快速在代码中传输视图/投影矩阵等。

    #include "GLTools.h"    
    #include "GLMatrixStack.h"
    #include "GLFrame.h"
    #include "GLFrustum.h"
    #include "GLBatch.h"
    #include "GLGeometryTransform.h"
    
    新增变量transformPipeline

      transformPipeline主要作用就是用来获取顶部矩阵堆栈的值。

    //设置变换管线以使用两个矩阵堆栈
    transformPipeline.SetMatrixStacks(modelViewMatrix, projectionMatrix);
    /* GLShaderManager 中的Uniform 值——平面着色器
    参数1:平面着色器
    参数2:运行为几何图形变换指定一个 4 * 4变换矩阵
     --transformPipeline.GetModelViewProjectionMatrix() 获取的
    GetMatrix函数就可以获得矩阵堆栈顶部的值
    参数3:颜色值
    */
    shaderManager.UseStockShader(GLT_SHADER_FLAT,
                                     transformPipeline.GetModelViewProjectionMatrix(),
                                     vGreen);
    
    重要函数的变化changeSize

      changeSize函数中,不光要设置视口大小,还要设置图元绘制时的投影方式。并把投影矩阵载入到顶部的模型视图矩阵栈顶。

    glViewport(0, 0, w, h);
    //创建投影矩阵,并将它载入投影矩阵堆栈中
    viewFrustum.SetPerspective(35.0f, float(w) / float(h), 1.0f, 500.0f);
    projectionMatrix.LoadMatrix(viewFrustum.GetProjectionMatrix());
    //调用顶部载入单元矩阵
    modelViewMatrix.LoadIdentity();
    
    重要概念矩阵堆栈
    //压栈
    modelViewMatrix.PushMatrix();
    //还原到以前的模型视图矩阵(单位矩阵)
    modelViewMatrix.PopMatrix();
    
      首先,视图变换一定会用到模型视图堆栈,然后立体图形变换就需要用到,投影视图矩阵堆栈。然后默认压栈是为了保存底部原来的视图堆栈,已达到随时可以复原的目的。下图可以清晰的解释压栈出栈。 压栈出栈流程

    完整demo

    相关文章

      网友评论

        本文标题:OpenGL渲染流程和矩阵堆栈

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