Shader笔记--渲染流程

看了那么多的教程,但是还是不知道渲染的整个流程是什么,是怎么就显示到了我们的屏幕上了,然后shader在这个流程中有着什么样的地位,敬请收看今天的笔记。嘿嘿嘿。来自《Unity shader入门精要》。
渲染大致可以分为:应用阶段、几何阶段、光栅化阶段,这三个大的阶段。

Shader笔记--渲染流程_第1张图片
渲染流水线中的三个概念阶段

简单的说这个三个阶段分别做什么:
应用阶段:开发者设置好数据、CPU收集数据、调用DrawCall传递数据给GPU
几何阶段:GPU处理数据
光栅化阶段:处理后的数据投射到屏幕上

应用阶段做了这三件事,然后我们最主要的是怎么渲染出来的是这样的。

Shader笔记--渲染流程_第2张图片
GPU的渲染流水线实现。颜色表示了不同阶段的可配置性或可编程性:绿色表示该流水线阶段是完全可编程控制的,黄色表示该流水线阶段可以配置但不是可编程的,蓝色表示该流水线阶段是由GPU固定实现的,开发者没有任何控制权。实线表示该shader必须由开发者编程实现,虚线表示该Shader是可选的

这里看到我们熟悉的顶点着色器与片元着色器,其他可控的模块我们可以忽略他们。
●顶点着色器:获得cpu传过来的数据并且做坐标的转换,就是熟悉的这句代码:

UnityObjectToClipPos(v.vertex);

把世界空间的点转换到剪裁空间。顶点是单独了,不能互相通信。

●裁剪:把没有在视野内的物体剔除掉。


Shader笔记--渲染流程_第3张图片
只有在单位立方体的图元才需要被继续处理。因此,完全在单位立方体外部的图元(红色三角形)被舍弃,完全在单位立方体内部的图元(绿色三角形)将被保留。和单位立方体相交的图元(黄色三角形)会被裁剪,新的顶点会被生成,原来在外部的顶点会被舍弃

●屏幕映射:把每一个图元的x、y轴转换到屏幕坐标系,坐标系决定了这个顶点对应屏幕上哪个像素以及距离这个像素有多远。
●三角形设置:计算光栅化一个三角网格所需的信息,简单的说就是获得三角形顶点的坐标。
●三角形遍历:根据上一个步骤结果判断一个三角网格覆盖了那些像素,并使用三角网格3个顶点的顶点信息对整个覆盖区域的像素插值。


Shader笔记--渲染流程_第4张图片
三角形遍历的过程。根据几何阶段输出的顶点信息,最终得到该三角网格覆盖的像素位置。对应像素会生成一个片元,而片元中的状态是对三个顶点的信息进行插值得到的。例如,对图2.12中三个顶点的深度进行插值得到其重心位置对应的片元的深度值为-10.0

●片元着色器:到我们比较熟悉的一个东西,它可以完成很多重要的渲染技术,其中最重要的技术之一就是纹理采样,然后经过光栅化阶段对三角网格的3个顶点对应的在中纹理坐标进行插值。就是我们平时用的这句代码:

tex2D(_MainTex,f.uv.xy)

这里我们需要在顶点着色器输出每个顶点对应的纹理坐标。

Shader笔记--渲染流程_第5张图片
根据上一步插值后的片元信息,片元着色器计算该片元的输出颜色

●逐片元操作:到了最后一个阶段了,这里做了大的两个任务:
1.决定每一个片元的可见性。有很多测试工作,例如深度测试、模板测试等。
2.如果一个片元通过了所有的测试,那么把该片元的颜色值和已经存储在颜色缓冲区中的颜色进行合并或者是混合。

逐片元操作阶段所做的操作。只有通过了所有的测试后,新生成的片元才能和颜色缓冲区中已经存在的像素颜色进行混合,最后再写入颜色缓冲区中

简单的理解这两个测试:
●模板测试:开发者可以控制的一个测试,可以自定义测试一个数据的测试。
●深度测试:离摄像机距离的一个测试,并会写入缓冲。


Shader笔记--渲染流程_第6张图片
模板测试和深度测试的简化流程图

●混合:然后把该片元的颜色值和已经存储在颜色缓冲区中的颜色进行合并或者是混合。


Shader笔记--渲染流程_第7张图片
混合操作的简化流程图

●Early-Z技术:为了优化GPU效率,把深度测试提前执行的技术。在Alpha测试中,我们把这个技术关了,使用了clip函数来把它舍弃掉。这个就会是GPU的效率降低。

这个流程是不是也可以叫做渲染管线。今天先讲到这里吧。

你可能感兴趣的:(Shader笔记--渲染流程)