三、OpenGL渲染架构

1. OpenGL的渲染架构

OpenGL的渲染架构

渲染流程:

  1. 设置顶点数据和其他参数。
  2. 在顶点着色器中进行运算得到裁剪坐标。
  3. 细分着色器、几何着色器,不可自定义,跳过。
  4. 图元设置,根据设置构成点、线、三角形。
  5. 裁剪,裁剪掉超出显示区域的部分。
  6. 光栅化, 将图源栅格化为一个个的像素点。
  7. 片元着色器,将对应的栅格(像素)填充为具体的颜色。
  8. 渲染图像。

2. 参数类型

  • attrubutes属性只能传入顶点着色器,不能直接传递到片元着色器,只能通过GLSL代码间接传递。

    • 顶点数据
    • 纹理坐标
    • 光照法线
    • 颜色数据
  • uniforms值可以传入顶点着色器、片元着色器。

3. 参数的使用

顶点着色器
我们可以通过attrubutes获取到顶点数据,通过uniforms获取到mvp矩阵,再进行运算得到最终的顶点坐标。

gl_Position = M_pro * M_view * M_model * V_local

片元着色器
比如在处理视频帧时,一般会使用YUV格式。要渲染到屏幕上需要将YUV格式转换为RGB格式。在片元着色器中,通过YUV数据进行矩阵运算就可以得到具体的RBG颜色值了。Alpha通道直接赋值为1.0。

RGB = YUV * 转换矩阵

纹理
像素数据。片元着色器中,可以通过纹理坐标获取到对应的颜色值。如果对得到的颜色值进行处理,就可以得到“滤镜”效果

3. 基本图元

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

GL_TRIANGLE_STRIP优点:

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

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

GL_CW:顺时针环绕的多边形为正⾯
GL_CCW:逆时针环绕的多边形为正⾯
glFrontFace(GL_CW);

4. 存储着⾊器

4.1 初始化

// GLShaderManager 的初始化
GLShaderManager shaderManager;
shaderManager.InitializeStockShaders();

4.2 不同的存储着⾊器

单元着⾊器

参数1: 存储着⾊器种类-单元着⾊器
参数2: 颜⾊值
GLShaderManager::UserStockShader(GLT_SHADER_IDENTITY, 
                                 GLfloat vColor[4]);

使⽤场景:绘制默认OpenGL 坐标系(-1,1)下图形。 图形所有片段都会以⼀种颜⾊填充。

平⾯着⾊器

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

使⽤场景:在绘制图形时, 可以应⽤变换(模型/投影变化)。

上⾊着⾊器

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

使⽤场景:在绘制图形时, 可以应⽤变换(模型/投影变化)。颜色将会平滑地插入到顶点之间,称为平滑着色。

默认光源着⾊器

参数1: 存储着⾊器种类-默认光源着⾊器
参数2: 模型4*4矩阵
参数3: 投影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: 纹理单元
GLShaderManager::UserStockShader(GLT_SHADER_TEXTURE_REPLACE,
                                 GLfloat mvMatrix[16],
                                 GLint nTextureUnit);

使⽤场景:在绘制图形时, 可以应⽤变换(模型/投影变化)。这种着⾊器通过给定的模型视图投影矩阵,使⽤纹理单元来进⾏颜⾊填充。其中每个像素点的颜⾊是从纹理中获取。

纹理调整着⾊器

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

使⽤场景:在绘制图形时, 可以应⽤变换(模型/投影变化)。这种着⾊器通过给定的模型视图投影矩阵。着⾊器将⼀个基本⾊乘以⼀个取⾃纹理单元nTextureUnit 的纹理,将颜⾊与纹理进⾏颜⾊混合后才填充到⽚段中。

纹理光源着⾊器

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

使⽤用场景:在绘制图形时, 可以应⽤变换(模型/投影变化)。这种着⾊器通过给定的模型视图投影矩阵,着⾊器将⼀个纹理通过漫反射照明计算进⾏调整(相乘)。

对应demo1代码。

对应demo2代码。

你可能感兴趣的:(三、OpenGL渲染架构)