Opengl管线流程为:
一开始为几何数据,例如顶点,几何图元,首先通过一系列的着色器处理他们,例如顶点着色器,镶嵌着色器,最后的几何着色器。光栅化为为所有的图元创建片段在clipping region内。并为每一个生成的片段执行fragment shader.
vertex shader和fragment shader是必须的,tessellation shader和geometry shader 是可选的。
下面详细讲解每个阶段。
1.为opengl准备数据
opengl要求数据都储存在buffer object中,buffer object是opengl管理的内存块。
其中一个方法是使用glNameBufferStorage().
2.发送数据给opengl
缓冲区初始化完成后,通过调用opengl的绘图函数请求图元的渲染。例如glDrawArrays().
Vertex shading
由顶点发出请求,vertex shader就会被调用去处理顶点数据。取决于其他预光栅化着色器是否被**
vertex shader可能非常简单,只是在处理阶段传送数据,叫做past-through shader;
较为复杂的情况,vertex shader进行多种计算,计算顶点的屏幕位置,叫transformation matrices
,使用灯光计算决定顶点颜色,或其他很多技术。
通常,一个复杂的应用包含很多vertex shader,但一次只能**一个。
Tessellation Shading
vertex shader处理完顶点数据,在**情况下,Tessellation shader阶段会继续处理这些数据,
曲面细分使用补丁描述物体的形状,增加面元的数量,提供更好看的模型。
tessellation shading包含两个阶段,处理补丁数据和生成最终形状。
Geometry shading
下一个阶段是几何着色器,允许对独立的几何图元记性额外的处理,在光栅化以前。
这个着色阶段是可选的,但是很强大。
Primitive Assembly
前面的阶段都在处理顶点,顶点数据怎么组织成几何面元并送入内部的OpenGL,原始组装阶段处理
顶点数据与原始图元,为折叠和光栅化做准备。
Clipping
偶尔,顶点可能会在视口的外面,OpenGl自动处理视口外的像素,让他们消失。
Rasterization
剪裁完以后,更新的图元会送入光栅器生成几何片段。光栅器的工作是决定屏幕的那个位置覆盖那个特定的几何
,如点,线,三角形。知道了这些位置和顶点数据,光栅器线性插值这些数据并送入fragment shader。
处理片段会发生在下面两个阶段,片段着色器和预片段操作。
光栅化开启片段的生命,决定最终片段的颜色,所有的处理可以加在片段上。
Fragment Shading
最终的操作是片段着色器,决定片段最终得的颜色和深度值,(下一个阶段可以更改颜色),片段着色器功能很强大,可以通过
纹理映射增加颜色,如果一个片段不应该被绘制,片段着色器也会终止他的处理,叫做fragment discard.
一个非常有用的区分vertex shader和fragment shader的区分方法:vertex shading(包括tessellation,geometry shading)
决定面元在屏幕上显示的位置。fragment shading决定片段显示的颜色。
Per-Fragment Operations
在这个阶段,片段的可见度取决于深度信息,z-buffering和stencil testing。