渲染流水线

渲染流水线


渲染流水线的主要任务在于由一个三维场景出发,生成(渲染)一张二维图像。
根据RTR4,渲染流程主要分为4个主要阶段:应用(Application)、几何处理(Geometry processing)、光栅化(Rasterization)和像素处理(Pixel Processing)。


应用阶段

此阶段的任务有:

  1. 准备好场景数据。如:光源信息,场景中的物体数据,摄像机的参数等。
  2. 粗粒度剔除(culling),包括视锥体剔除(Frustum Culling)和遮挡剔除(Occlusion Culling)两种。为了提高渲染性能,把不可见的物体剔除出去,这样就不需要再移交给几何处理阶段进行处理了。
    视锥体剔除:裁剪的依据主要是根据摄像机的视野(field of view)以及近裁减面和远裁剪面的距离,将可视范围外的物体排除出渲染,被剔除的物体将不会进入渲染的几何处理阶段。
    遮挡剔除:把那些被其他游戏对象完全挡住(遮挡)的游戏对象排除出渲染。
  3. 把渲染所需要的数据加载到显存。
  4. 设置渲染状态准备渲染参数。这些状态定义了场景中的网格是怎样被渲染的。例如:使用哪个着色器,光源属性,材质等。设置不同类别物体的渲染顺序。设置渲染目标,即最终结果输出到FrameBuffer还是RenderTexture。设置渲染模式,即使用前向渲染还是延迟渲染。
  5. 调用Draw Call。CPU通过调用Draw Call来告诉GPU开始进行一个渲染过程。一个Draw Call会指向本次调用需要渲染的图元(primitives)列表。图元可以是点、线、三角面等。

几何处理阶段

  1. 顶点着色器。主要任务有两个:
    • 坐标变换。最基本且必须完成的工作,通过MVP矩阵把顶点从模型空间转换到齐次裁剪空间。除此之外,还可以改变顶点的位置,实现顶点动画。
    • 计算程序员想要的顶点输出数据,比如纹理、法线坐标等。为了生成真实的场景,仅仅渲染对象的形状和位置是不够的,还必须对其外观进行建模——包括每个物体的材质,以及任何光源照射在物体上的效果。确定光在材料上的效果的操作被称为着色(shading)。包括计算物体上不同点的着色方程。通常,其中一些计算是在模型顶点的几何处理期间执行的,而另一些可能是在逐像素处理期间执行的。各种各样的材料数据可以存储在每个顶点,比如点的位置、法线、颜色或者任意其他数字信息,这些是计算着色方程所需要的。顶点着色结果(可以是颜色,向量,纹理坐标,以及任何其他类型的着色数据)然后被发送到光栅化和像素处理阶段插值和用于计算表面的着色。
  2. 曲面细分(可选)。通过曲面细分,一个曲面可以生成一个适当数量的三角形。
  3. 几何着色器(可选)。可以利用几何着色器将输入的图元拓展为一个或多个图元,亦或者根据某些条件选择不输出任何图元。
  4. 投影。进行齐次除法,该过程一般是硬件做的,把顶点从齐次裁剪空间转换到归一化设备坐标(NDC)。
  5. 裁剪
  6. 屏幕映射。每个图元的x和y坐标被变换为屏幕坐标。

注意:

  • 在第1点中我说通过MVP矩阵把顶点从模型空间转换到齐次裁剪空间。其实这是不太准确的,当没有使用曲面细分着色器和几何着色器时这么说是正确的,但是如果使用了它们,又由于它们会产生或者消减(几何着色器)图元,因此此时将顶点转换到齐次裁剪空间需要在它们中去做。
  • 把顶点从齐次裁剪空间转换到NDC才是真正的投影,因为此时才真正的得到了二维坐标。而把顶点坐标转换到齐次裁剪空间只是在为真正的投影做准备。

光栅化阶段

  1. 三角形设置。根据顶点的信息得到三角形边界的信息。
  2. 三角形遍历。寻找被三角形网格所覆盖的所有像素。使用三角形的三个顶点,在每个被覆盖的像素处插值,从而得到三角形在这些像素上对应的片元数据。
    • 片元和像素的区别:片元是包含了很多状态的集合(如屏幕坐标,深度信息,法线,纹理坐标等等),这些状态用于计算每个像素的最终颜色。

像素处理阶段

  1. 片元着色器。输出一个或多个颜色值。

  2. 融合。有几个主要任务:

    • 决定每个片元的可见性。涉及测试工作:深度测试、模板测试等。
    • 若片元通过所有测试,把这个片元的颜色值和已经存储在颜色缓冲区中的颜色进行混合。每个像素的信息存储在颜色缓冲区(color buffer)中,颜色缓冲区是一个矩形的颜色数组(每一种颜色对应一个红、一个绿、一个蓝组件)。融合阶段负责将像素着色阶段产生的片段颜色与当前存储在缓冲区中的颜色结合起来。

评论