看了那么多的教程,但是还是不知道渲染的整个流程是什么,是怎么就显示到了我们的屏幕上了,然后shader在这个流程中有着什么样的地位,敬请收看今天的笔记。嘿嘿嘿。来自《Unity shader入门精要》。
渲染大致可以分为:应用阶段、几何阶段、光栅化阶段,这三个大的阶段。
简单的说这个三个阶段分别做什么:
应用阶段:开发者设置好数据、CPU收集数据、调用DrawCall传递数据给GPU
几何阶段:GPU处理数据
光栅化阶段:处理后的数据投射到屏幕上
应用阶段做了这三件事,然后我们最主要的是怎么渲染出来的是这样的。
这里看到我们熟悉的顶点着色器与片元着色器,其他可控的模块我们可以忽略他们。
●顶点着色器:获得cpu传过来的数据并且做坐标的转换,就是熟悉的这句代码:
UnityObjectToClipPos(v.vertex);
把世界空间的点转换到剪裁空间。顶点是单独了,不能互相通信。
●裁剪:把没有在视野内的物体剔除掉。
●屏幕映射:把每一个图元的x、y轴转换到屏幕坐标系,坐标系决定了这个顶点对应屏幕上哪个像素以及距离这个像素有多远。
●三角形设置:计算光栅化一个三角网格所需的信息,简单的说就是获得三角形顶点的坐标。
●三角形遍历:根据上一个步骤结果判断一个三角网格覆盖了那些像素,并使用三角网格3个顶点的顶点信息对整个覆盖区域的像素插值。
●片元着色器:到我们比较熟悉的一个东西,它可以完成很多重要的渲染技术,其中最重要的技术之一就是纹理采样,然后经过光栅化阶段对三角网格的3个顶点对应的在中纹理坐标进行插值。就是我们平时用的这句代码:
tex2D(_MainTex,f.uv.xy)
这里我们需要在顶点着色器输出每个顶点对应的纹理坐标。
●逐片元操作:到了最后一个阶段了,这里做了大的两个任务:
1.决定每一个片元的可见性。有很多测试工作,例如深度测试、模板测试等。
2.如果一个片元通过了所有的测试,那么把该片元的颜色值和已经存储在颜色缓冲区中的颜色进行合并或者是混合。
简单的理解这两个测试:
●模板测试:开发者可以控制的一个测试,可以自定义测试一个数据的测试。
●深度测试:离摄像机距离的一个测试,并会写入缓冲。
●混合:然后把该片元的颜色值和已经存储在颜色缓冲区中的颜色进行合并或者是混合。
●Early-Z技术:为了优化GPU效率,把深度测试提前执行的技术。在Alpha测试中,我们把这个技术关了,使用了clip函数来把它舍弃掉。这个就会是GPU的效率降低。
这个流程是不是也可以叫做渲染管线。今天先讲到这里吧。