OpenGL渲染管线
定义:渲染管线是一系列数据处理过程,并且将应用程序的数据转换到最终渲染的图像。下面是渲染管线流程图:
从上图我们可以看出OpenGL首先接收用户提供的几何数据(顶点座标、顶点纹理等),并且将它输入到一系列着色器阶段中进行处理,包括顶点着色、细分着色、几何着色,然后将它送入到光栅化单元。光栅化单元负责对所有剪切区域内的图元生成片元数据,然后对每个生成的片元都执行一次片元着色器。看起来好像很复杂,但是我们并不需要用到所有的着色阶段,事实上,只有顶点和片元着色器是必须的,细分和几何是可选的。下面我们就对每一个阶段进行详细的解释。
顶点数据
作为OpenGL渲染管线的第一个步骤,我们主要是做一些数据准备,涉及的数据有顶点座标(必须)、顶点纹理座标、顶点法向量座标等,要传哪些数据是根据我们的需求而定的,不过在这些数据里面顶点座标是必须的。需要注意的是OpenGL要的顶点数据并不是简单的像点A(1,2,3),我们需要在定义或者获取到点数据之后将它转化为缓存对象。将顶点数据转化为缓存对象之后就可以传递并进入到下一阶–段顶点着色器。
顶点着色器
顶点着色器的作用就是处理顶点相关的数据,它会对我们在顶点数据阶段传入的所有顶点进行单独处理。在这里顶点着色器可能很简单也可能很复杂,简单的像不做任何处理直接把数据传给下一个阶段;复杂的话就是做大量的数据处理,比如矩阵变换、颜色处理、纹理处理等。
通常一个复杂的应用程序可能包含许多顶点着色器,但是在同一时刻只能有一个顶点着色器起作用。
细分着色(可选)
细分着色器会使用patch来描述物体的形状,其结果是几何图元的数量增加,并且模型的外观会变得更加平顺。其实就是对顶点着色器传递的数据进行二次处理,平滑模型。
几何着色(可选)
允许在光栅化之前对每个几何图元做进一步处理,例如创建新的图元,丢弃不需要的图元,甚至丢弃所有图元。
图元装配
前面的阶段都是处理顶点数据,而图元装配阶段则是将这些顶点与相关的几何图元之间组织起来,准备下一步的剪切和光栅化工作。
剪切
顶点可能落在视口(我们可以进行绘制的窗口区域)之外,此时与顶点相关的图元会作出改动,以保证相关的像素不会在视口外绘制。
光栅化
剪切之后将更新之后的图元传递到光栅化单元,生成对应的片元。光栅化的工作是判断某一部分几何体(点、线、三角形)所覆盖的屏幕空间,其实就是将输入的数学描述转换为屏幕位置对应的像素片元,供片元着色器使用,此时的片元是候选的,在片元着色器阶段可能使用,也可能丢弃。
片元着色
最后一个可通过编程控制屏幕上显示颜色的阶段,在这个阶段我们使用着色器来计算片元的最终颜色和它的深度值,在这里我们还可以对不需要的片元进行丢弃
逐片元操作
在这个阶段我们会使用深度测试和模板测试等方式来决定一个片元是否可见。如果一个片元成功地通过了所有激活的测试,那么它就可以被直接绘制到帧缓存中,它对应的像素的颜色值(也可能包含深度值)会被更新,如果开启了融混模式,那么片元的颜色会与该像素当前的颜色相叠加,形成一个新的颜色值并写入帧缓存中。
以上就是OpenGL管线渲染流程的全部内容,可能还有许多不足之处,望大家指出,互相学习。