什么渲染管线
渲染管线跟工厂的流水线一样,工厂的流水线为了生成最终的一个产品,每个流水线的工人只干一件特定的事情,最后将一个产品完成。计算机的图形渲染管线和工厂的流水线一样,只是图形渲染管线最终生成的是一张二维图片。
我们将一个渲染流程分成3个阶段:应用阶段、几何阶段、光栅化阶段。注意这仅仅是概念性阶段,每个阶段本身通常也是一个流水线系统,即包含了子流水线阶段。如下图:
- 应用阶段
从名字我们可以看出,这个阶段是由我们的应用主导的,因此通常由CPU负责实现。换句话说,我们这些开发者具有这个阶段的绝对控制权。 在这阶段中,开发者有3个主要任务: 1. 我们要准备好场景数据,例如摄像机的位置、视椎体、场景中包含了哪些模型、使用了哪些光源等等; 2. 为了渲染性能,我们往往需要做一个粗粒度剔除(culling)工作,以把哪些不可见的物体踢出去,这样就不需要再移交给几何阶段进行处理; 3. 最后我们要设置好每个模型的渲染状态,这些渲染状态包括但不限于它们使用的材质(漫反射颜色、高光反色颜色)、使用的纹理、使用的Shader等。 这一阶段最重要的输出是渲染所需的几何信息,即渲染图元(rendering primitives)。通俗来讲,渲染图元可以是点、线、三角面等。这些渲染图元将会被传递给下一个阶段——几何阶段。
- 几何阶段
几何阶段用于处理所有和我们要绘制的几何相关的事情。例如,决定需要绘制的图元是什么,怎么绘制它们,在哪里绘制它们。这一阶段通常在GPU上进行。 几何阶段负责和每个渲染图元打交道,进行逐顶点、逐多边形的操作。这个阶段可以进一步分成更小的流水阶段,这在下一章中会讲到。几何阶段的一个重要任务就是把顶点坐标变换到屏幕空间中,再交给光栅器进行处理。通过对输入的渲染图元进行多步处理后,这一阶段将会输出屏幕空间的二维顶点坐标、每个顶点对应的深度值,着色相等相关信息**,并传递给下一个阶段。
- 光栅化阶段
这一阶段将会使用上个阶段传递的数据来生成屏幕上的像素,并渲染出最终的图像。这个阶段也是在GPU上运行。光栅化的任务主要是决定每个渲染图元中的哪些像素应该被绘制在屏幕上。它需要对上一个阶段得到的逐顶点数据(例如纹理坐标,顶点颜色等)进行插值,然后在进行逐像素处理。和上一个阶段相似,光栅化阶段也可以分成更小的流水线阶段。