什么是渲染管线
渲染管线也叫渲染流水线,一般我们将渲染流程分成3个阶段:
应用阶段
应用阶段的功能通常由CPU负责实现,开发者具有对这个阶段的绝对控制权。应用阶段开发者由3个任务:1.准备好场景数据(摄像机,视锥体,模型,光源等)
2.为了提高渲染性能,我们在这里会做一些剔除工作
3.设置渲染状态,例如模型的颜色,纹理,使用哪个shader等
这一阶段最重要的是输出渲染所需要的几何信息
几何阶段
几何阶段处理所有和我们要绘制的几何相关的事情。决定需要绘制的图元是什么,怎么样绘制它们,在哪里绘制它们。这一阶段通常在GPU上进行。几何阶段会做哪些事情呢,如下图所示
1.顶点着色器:是流水线的第一个阶段,它的输入来自CPU。顶点着色器处理的单位是顶点,也就是说,输入进来的每个顶点都会调用一次顶点着色器。顶点着色器完成2个工作:
(1)坐标变换
就是对顶点的坐标进行某种变换。当然,必须要做的变换是将顶点坐标从模型空间转换到齐次裁剪 空间。 当然我们可以自己加入很多顶点变换,如,模拟水面的顶点扰动,布料模拟的顶点计算等
(2)逐顶点光照
2.曲面细分着色器(非必须):
3.几何着色器(非必须):
4.裁剪:由于我们场景会很大,而摄像机的视野范围很有可能不会覆盖所有的场景物体,不在视野范围内的不需要处理,裁剪就是为了完成这个目的。
5.屏幕映射:将空间坐标转换为屏幕坐标
光栅化阶段
这一阶段会使用几何阶段传递的数据来产生屏幕上的像素,并渲染出最终的图像。这一阶段也子啊GPU上运行。
1.三角形设置:计算光栅化一个三角形所需要的网格信息
2.三角形遍历: 三角形遍历阶段检查每个像素是否被一个三角形网格所覆盖。如果被覆盖的话,就会生成一个片元。
3.片元着色器:片元着色器的输入是上一个阶段对顶点信息插值得到的结果,更具体来说,是根据那些从顶点着色器中输出的数据插值得到的。而它的输出是一个或者多个颜色。这一阶段完成很多重要的渲染技术,其中最重要的技术之一就是纹理采样。为了在片元着色器中进行纹理采样,我们通常会在顶点着色器阶段输出每个顶点对应的纹理坐标,然后经过光栅化阶段对三角形网格的3个顶点对应的纹理坐标进行查之后,就可以得到其覆盖的片元的纹理。
4.逐片元操作:
(1) 决定每个片元的可见性。如深度测试,模板测试等
(2) 对片元进行着色
CPU和GPU的通信
渲染流水线的起点是CPU,即应用阶段,可以分为一下三个阶段
把数据加载到现存中设置渲染状态调用DrawCall
什么是DrawCall,GPU调用图像编程接口,如OpenGL中的glDrawElements命令或者DirectX中的DrawIndexedPrimitive命令,以命令GPU进行渲染操作。
总结
参考书籍:Unity Shader 入门精要