光栅化的渲染管线一般分为三大阶段:应用程序阶段->几何阶段->光栅化阶段
也可以四大阶段: 应用程序阶段->几何阶段->光栅化阶段->逐片元操作阶段
更详细的流程如下:
Vertex Specification(顶点规范化):
在渲染管线中,Vertex Specification 通常发生在顶点着色器(Vertex Shader)之前。顶点着色器(Vertex Shader)是渲染管线中的一个重要阶段,主要负责处理顶点数据。在顶点着色器之前,需要先进行顶点规范(Vertex Specification),即确定渲染所需的顶点数据,包括顶点的位置、纹理坐标、法线向量等信息。这些顶点数据会被送入渲染管线,并在后续的阶段中被处理和渲染。因此,Vertex Specification 可以看作是渲染管线中顶点着色器的前置处理阶段。
Vertex Processing(顶点处理):
Vertex Processing(顶点处理)是渲染管线中的一个重要阶段,主要负责处理顶点数据。具体来说,顶点处理涉及以下几个主要方面:
- 顶点着色器(Vertex Shader):用于对每个顶点进行各种操作,例如变换(transformation)、光照(lighting)等。
- 曲面细分着色器(Tessellation Shader)主要用于对网格中的三角形进行细分,以增加物体表面上的三角形数量,从而提升模型表面的细节和平滑度。 曲面细分着色器通过将低精度网格转换为高精度网格,使得渲染结果更加细腻和逼真。曲面细分着色器通常位于顶点着色器之后,图元装配和光栅化之前。通过将顶点着色器的输出传递给曲面细分着色器,并使用相应的算法进行细分处理,可以得到更加丰富的三角形网格,从而提升模型表面的细节和表现力。
- 几何着色器(Geometry Shader):
几何着色器的主要功能是对输入的图元(如点、线段、三角形)进行操作,并根据需要生成零个、一个或多个输出的新的图元。
几何着色器可以实现一些有趣的效果,例如对图元进行细分、放大缩小、几何形状的变换等。此外,几何着色器还可以用于实现粒子系统、草地生成等特殊效果。
几何着色器的输入是完整的图元,输出是新的图元。在渲染管线的运行过程中,几何着色器阶段将接收来自顶点着色器的输出数据,并对其进行进一步处理。然后,根据需要生成新的图元,并将它们传递给下一个阶段进行处理。
Vertex Post Processing(顶点后处理阶段)发生在顶点处理阶段结束后,图元装配和光栅化之前。这个阶段主要进行一些顶点的优化和调整操作,例如对顶点位置进行修正、对顶点进行合并等。 在顶点后处理阶段,通常会使用一些数学函数或算法对顶点数据进行处理,例如对顶点位置进行修正可以使用线性插值等方法。此外,这个阶段还可以对顶点进行合并操作,以减少图元的数量和减小渲染的复杂度。
- Transform Feedback(变换反馈)是OpenGL ES 3.0渲染管线中的一个步骤,发生在顶点处理阶段结束后,图元装配和光栅化之前。这个步骤可以重新捕获即将装配为图元(点、线段、三角形)的顶点,并将它们的部分或者全部属性传递到缓存对象。Transform Feedback的主要作用是将顶点着色器的处理结果输出,并且可以有多个输出,这样可以将大量的向量或矩阵运算交给GPU并行处理。每个顶点在传递到图元装配阶段时,将所有需要捕获的属性数据记录到一个或者多个缓存对象中,程序可以通过这些缓存读出这些数据,可以将它们用于后续的渲染操作。
图元装配(Primitive Assembly)在渲染管线的顶点处理阶段之后,图元装配和光栅化之前。它负责将顶点着色器处理过的顶点组装成一个一个独特的可以被渲染的几何图元,如三角形、线、点块纹理。在组装好图元之后,它会判断该图元是否处于屏幕的可显示的范围内,如果图元完全不在屏幕的可显示范围内,那么它就会丢弃该图元,如果图元有一部分在可显示的范围内,则裁切图元,丢弃不在屏幕显示范围内的部分。(Face Culling)除此之外,图元装配也会去判断图元的朝向是面向正面还是背面,如果图元是面向背面的,那么该图元也会被丢弃。
光栅化(Rasterization)操作是指将几何图形(例如点、线、多边形等)转换为像素图像的过程。这个过程涉及到将几何图元的顶点坐标转换为屏幕坐标,并对图元的几何信息进行插值和填充。在光栅化过程中,需要将连续的几何图形映射到离散的像素上,并根据像素的位置和属性来确定其颜色和深度等值。
片元着色器(Fragment Shader)主要负责计算每个像素的颜色值。在光栅化阶段中,几何图形被转换为一个个的片段(Fragments),每个片段对应于屏幕上的一个像素。这些片段会传递给片元着色器进行处理,以计算出最终的像素颜色值。
在片元着色器中,开发人员可以定义像素的颜色计算方法,例如根据纹理采样结果计算像素颜色、进行光照计算等等。开发人员还可以使用片元着色器来实现各种图形特效和渲染技术,例如透明度、阴影、反射等等。
Per-sample processing(逐片元操作)主要用于对光栅化生成的每个片元进行处理。
逐片元操作的主要内容:
像素所有权测试→裁剪测试→透明度测试→模板测试→深度测试→透明度混合