此文章收录于我主页顶置的:
Unity Shader入门精要文章目录,点击即可跳转。
前言:在开始学习之前,我们有必要要了解什么是Shader,即着色器,与之关系非常紧密的就是渲染流水线,我们要想了解Shader就必须了解渲染流水线的工作流程。
渲染流水线的最终目的是渲染一张二维纹理,它的输入是一个虚拟摄像机、一些光源、一些Shader以及纹理。
1.1什么是流水线?
流水线在生活中应用很广泛,在工业生产中尤其常见。
例如有一个生产汽车的工场,我将一个汽车的生成流程分成四个步骤,每个步骤都需要两个小时才能够完成,这样在没有生产流水线之前,只有每台汽车完成可所有这4个工序后才能够生产下一台汽车,那么要生产出一台汽车,我们就需要2*4个小时。
现在我们有了生成流水线之后,生产一台汽车还是需要四个工序,但是并不需要从头到尾完成全部的工序,而是每个工序由专门的人来完成,所有工序并行进行,也就是说,当工序一完成后的汽车产品,将会递交给工序二,工序一接着做工序一该做的,工序二完成后递交给工序三,工序二接着做第二个工序需要做的…
这里拿一个饼干包装的流水线工作图来举个例子:
使用流水线的好处在于可以提高单位时间的产量,在汽车生产的工序中,使用流水线生产后,每两个小时就能够生产出一台汽车,而且我们能够发现,流水线中决定生产速度的是最慢的那一道工序,即耗时最多的工序是性能瓶颈。
在理想情况下,如果把一个非流水线系统分成n个流水线阶段,且每个阶段耗费时间相同的话,会使整个系统得到n倍的速度提升。
1.2什么是渲染流水线?
上面关于流水线的概念也适用于计算机的图像渲染中。渲染流水线的工作任务是由一个三维场景出发、生产或者渲染一张二维图像,换句话来说就是计算机需要从一系列的顶点数据、纹理等信息出发,把这些信息最终转换成一张人眼可见的图像,而这个工作通常是由CPU和GPU共同完成
一个渲染流程分为三个阶段:应用阶段、几何阶段、光栅化阶段
值得注意的是:这里仅仅是概念性阶段,每个阶段本身通常也是一个流水线系统,既包含了子流水线阶段。
1.2.1 应用阶段
从名字我们可以看出,这个阶段是由我们的应用主导的,因此通常由CPU负责实现。换句话说,我们这些开发者具有这个阶段的绝对控制权。
在这阶段中,开发者有3个主要任务:
首先,我们需要准备好场景数据,例如摄像机的位置、视锥体、场圾中包含了哪些模型、使用了哪些光源等等。
其次,为了提高谊染性能,我们往往需要做一个粗粒度 剔除(ullig)工作,以把那些不可见的物体剔除出去, 这样就不需要再移交给几何阶段进行处理。
最后,我们需要设置好每个模型的渲染状态。这些渲染状态包括但不限于它使用的材质(漫反射颜色、高光反射颜色)、使用的纹理、使用的Shader 等。这阶段最重要的输出是渲染所需的几何信息,即渲染图元(rendering primitives)。通俗来讲,渲染图元可以是点、线、三角面等。这些渲染图元将会被传递给下一个阶段一几何阶段。
由于是由开发者主导这一阶段, 因此应用阶段的流水线化是由开发者决定的。
1.2.2 几何阶段
几何阶段用于处理所有和我们要绘制的几何相关的事情。例如,决定需要绘制的图元是什么,怎样绘制它们,在哪里绘制它们。这一阶段通常在GPU上进行。
几何阶段负责和每个渲染图元打交道,进行逐顶点、逐多边形的操作。这个阶段可以进一步分成更小的流水线阶段。
几何阶段的一个重要任务就是把项点坐标变换到屏幕空间中,再交给光栅器进行处理。通过对输入的渲染图元进行多步处理后,这一阶段将会输出屏幕空间的二维顶点坐标、每个顶点对应的深度值、着色等相关信息,并传递给下一个阶段。
1.2.3光栅化阶段
这一阶段将会使用上个阶段传递的数据来产生屏幕上的像素,并渲染出最终的图像。这一阶段也是在GPU上运行。光栅化的任务主要是决定每个渲染图元中的哪些像素应该被绘制在屏幕上。它需要对上一个阶段得到的逐顶点数据(例如纹理坐标、顶点颜色等)进行插值,然后再进行逐像素处理。
和上一个阶段类似,光栅化阶段也可以分成更小的流水线阶段。
读者需要把上面的3个流水线阶段和我们将要讲到的GPU流水线阶段区分开来。
提示:
这里的流水线均是概念流水线,是我们为了给一个渲染流程进行基本的功能划分而提出来的。下面要介绍的GPU流水线,则是硬件真正用于实现上述概念的流水线。
点击可查看我的所有Shader学习文章,持续更新:Unity Shader入门精要文章目录