美文网首页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