返回
Featured image of post Shader入门精要-渲染流水线

Shader入门精要-渲染流水线

笔记摘自书籍《Shader入门精要》

渲染流水线的概念是指将一个三维场景渲染成一张张二维图像投射到电脑屏幕的过程,这个过程通常是由CPU与GPU共同完成的。

渲染流程分为三个阶段:应用阶段、几何阶段、光栅化阶段

应用阶段

这一部分通常由CPU负责,分为三个主要任务。第一步,准备好场景中需要渲染的数据(视锥体、模型、光源等);第二部,进行粗粒度剔除工作,把那些不可见的物体剔除出去,第三步,设置好每个模型的渲染状态(贴图、文理、shader等),然后输出渲染图元(点、线、三角面等)给下一个阶段。

几何阶段

几何阶段的主要任务是将输入过来的图元信息进行多部处理转换成输出屏幕空间的二维顶点坐标、每个顶点对应的深度值、着色等相关信息,并传递给下一个阶段。

光栅化阶段

这一阶段会将上一个阶段传递的数据来产生屏幕上的像素,并渲染出最终的图像。

这里将应用阶段详细的拿出来介绍。

  1. 渲染流水线的起点是CPU,所有需要渲染的数据都需要从硬盘中加载到系统内存中,然后将网格纹理等数据传输到显存中。

    当把数据传输到显存后,RAM中的数据就可以移除了,但是一些网格数据等CPU任然需要拿来做碰撞检测,所以这些数据我们就不希望被移除,因此,从硬盘中加载到内存是一个十分耗时的过程。在这之后,CPU将指导GPU如何进行渲染工作。

  2. 渲染状态决定了场景中的网格将采用什么样的方式被渲染,列如:顶点渲染、面片渲染、又或者光源、材质等。

  3. 当上面的工作都准备好后CPU就需要调用一个渲染命令来告诉GPU:“我帮你把数据都准备好了,现在你可以按照我的设置来进行渲染了。”这个渲染命令就是Draw Call

    当GPU从CPU那里的到渲染命令后就会进行一系列的GPU渲染操作,也成为GPU流水线,也就是几何阶段与光栅化阶段。

这里我们将主要的流水阶段进行详细解释

  1. 顶点着色器主要负责内容如下
    • 坐标转换。

      把顶点坐标从模型空间转换到齐次裁剪空间。我们可以通过改变顶点位置来模拟水面布料等。

    • 顶点光照。

  1. 裁剪主要任务就是将那些不在摄像机视野范围内的物体剔除。如果某个物体部分在视野外,而其他在视野内的话,视野外的顶点则会用一个新的顶点代替。注意这一步是不可编程的。

  2. 屏幕映射的任务是将每一个图元的XY坐标转换成屏幕坐标系

     OpenGL和DirectX的屏幕坐标系差异。对于一张512*512大小的图像,在OpenGL中 其(0, 0)点在左下角,而在DirectX中其(index.assets/14124843-0410210f56bfcade.png)点在左上角
    OpenGL和DirectX的屏幕坐标系差异。对于一张512*512大小的图像,在OpenGL中 其(0, 0)点在左下角,而在DirectX中其(index.assets/14124843-0410210f56bfcade.png)点在左上角

  3. 三角形设置会计算光栅化一个三角网格所需的信息,将上一步获得的三角形顶点连接成线,三角形的边。

  4. 三角形遍历会将三角网格覆盖的每一个像素点生成一个片元(片元包含屏幕坐标、深度信息、等点信息、法线文理坐标等,不包含颜色信息)

  5. 片元着色器将上一个阶段对顶点信息插值得到每个像素点的颜色。

  6. 逐片元操作

  • 决定每个片元的可见性,涉及很多测试工作,列如深度测设,模板测试等。

  • 如果一个片元通过的所有的测试,那么接下来据需要把这个片元的颜色值和颜色缓冲区的颜色进行合并。

    对于不透明的物体,我们可以关闭**混合(Blend)**操作,这样片元着色器计算得到的颜色值就会直接覆盖掉颜色缓冲区的像素值。但对于半透明物体我就需要让混合操作来让这个物体看起来是透明的。混合操作就像是PS里的图层关系,不透明图层会直接覆盖下面的图层像素值。