目录
渲染流水线
应用阶段
CPU负责实现
准备基本数据:场景物体数据(物体变换数据,物体网格数据),摄像机数据(位置方向,远近裁剪平面,投影方式,视口比例),光源阴影数据(光源类型,位置,方向角度等等,设置光源阴影,逐光源绘制阴影贴图),其他全局数据
粗粒度剔除:把不可见的物体剔除出去,便不需要把这些移交给几何阶段进行处理
进行渲染设置:使用哪个顶点着色器、片元着色器,光源属性,材质等等
输出到几何阶段:顶点数据(位置,颜色,法线,纹理uv坐标,其他顶点数据),MVP变换矩阵,纹理贴图,其他数据
当给定了一个 Draw Call 时, GPU 就会根据渲染状态(例如材质、纹理,着色器等)和所有输入的顶点数据来进行计算, 最终输出成屏器上显示的那些漂亮的像素。
CPU调用Draw Call命令GPU进行渲染,GPU渲染的过程便是GPU流水线
把数据加载到显存中——>设置渲染状态——>调用DrawCall
几何阶段
顶点着色器:实现顶点的空间变换,顶点着色等功能。
把顶点坐标从模型空间转换到齐次裁剪空间。
曲面细分着色器:细分图元。
几何着色器:逐图元着色操作或被用于产生更多的图元。基于图源的操作。
开发者可以控制GPU对顶点进行增删改操作。几何着色器与顶点着色器都可以对顶点的坐标进行修改,但几何体着色器并行调用硬件困难,并行程度低,效率和顶点着色器有很大的差距;如果不是要做顶点增、删这些仅仅能用几何着色器实现的效果,那么还是用顶点着色器来完成吧。
投影:这个阶段中,GPU将顶点从摄像机观察空间转换到裁剪空间(又被称为齐次裁剪空间),为之后的剔除过程以及投射到二维平面做准备。
裁剪:将不在摄像机视野内的顶点裁剪掉。
NDC(Normalized Device Coordinates ):归一化的设备坐标
屏幕映射:把每个图元的坐标转换到屏幕坐标系中。
x和y坐标转换到屏幕坐标系下,屏幕坐标系为一个二维坐标系,与我们显示画面的分辨率有很大关系。
z坐标与屏幕坐标系构成了一个窗口坐标系,这些值会一起被传递到光栅化阶段(深度缓冲z-buffer)。
光栅化阶段
两个最重要的目标:每个图元覆盖了哪些像素,为这些像素计算它们的颜色
三角形设置:我们从上一个阶段获得图元的顶点信息,也就是三角面每条边的两个端点,但如果要得到整个三角网格对像素的覆盖情况,我们就必须计算每条边上的像素坐标。为了能够计算边界像素的坐标信息,我们就需要得到三角形边界的表示方式。这样一个计算三角网格表示数据的过程就叫做三角形设置。
三角形遍历:三角形遍历阶段会根据上一个阶段的计算结果来判断一个三角网格覆盖了哪些像素,并使用三角网格3个顶点的顶点信息对整个覆盖区域的像素进行插值。
这一步的输出就是得到一个片元序列。需要注意的是,一个片元并不是真正意义上的像素,而是包含了很多状态的集合,这些状态用于计算每个像素的最终颜色。这些状态包括了(但不限于)它的屏幕坐标、深度值Z、顶点颜色,以及其他从几何阶段输出的顶点信息,例如法线、纹理坐标等。
片元着色器:为每个片元计算颜色。我们所谓的贴图纹理采样,就是在这一步完成的。这部分大量的信息在shader编写的范畴里。
逐片元阶段
对每个片元进行操作将它们的颜色以某种形式合并,得到最终在屏幕上像素显示的颜色。
可见性:每个偏远的可见性,裁剪测试,透明度测试,深度测试,模板测试等。
混合:如果一个片元通过了所有的测试,就需要把这个片元的颜色值和已经储存在颜色缓冲区中的颜色进行合并。
补充
后处理
抗锯齿
参考资料
《unity shader 入门精要》