1.渲染管线的作用
渲染管线的核心功能是利用给定的虚拟相机,三维物体,光源等信息,来生成或者渲染一张二维图像
2.整体流程
一种粗略的划分方法是将渲染管线划分成四个阶段——应用阶段(Application),几何处理阶段(Geometry Processing),光栅化阶段(Rasterization )和像素处理阶段(Pixel Processing)
这里参考了RTR4中的划分方法,不同的书籍可能划分方法不同。
3.应用阶段
应用阶段通常是在cpu上完成的。主要分为以下几个部分。
3.1准备基本场景数据
准备场景物体数据,比如物体的变换数据(物体的位置,旋转,缩放等),物体的网格数据(顶点位置,uv,法线等等)
摄像机数据,摄像机的位置和朝向,远近截面,摄像机的模式(正交还是透视),FOV和视口比例(长宽比)
光源及阴影数据,比如场景中包含哪些光源,以及它们的类型(方向光,点光源,聚光灯)和参数(位置,朝向,角度等),是否需要阴影(光源可见范围内是否有可以投射阴影的物体),阴影参数(对应光源序号,阴影强度,级联参数,深度偏移,近平面偏移等),然后是逐光源绘制阴影贴图作为阴影数据供后面的阶段使用
其他全局数据,比如变换矩阵等等
3.2加速算法和粗粒度的剔除
可见光裁剪,比如点光源和聚光灯与视锥体的距离非常远,因为有光照的衰减就可以剔除掉
可见场景物体裁剪,对于与视锥体完全不相交的物体进行剔除(视锥剔除),也可以对被其他物体遮挡住的物体进行剔除(遮挡剔除),常见算法有八叉树,BVH包围盒等等
3.3渲染设置
绘制设置:使用着色器以及合批方式
绘制物体的顺序:相对摄像机的距离或者Render Queue等等
渲染目标:帧缓存(FrameBuffer)或者渲染到纹理上(RenderTexture),也可以输出到多个渲染目标然后再通过特定的方式合并到一起
渲染模式:前向渲染或者延迟渲染
3.4调用DrawCall输出渲染图元到显存
顶点数据:位置,颜色,法线,纹理uv坐标,其他顶点数据
其他数据: MVP变换矩阵,纹理贴图,其他数据
4.几何处理阶段
4.1顶点着色器
视图变换:通过MVP矩阵进行空间变换,最后变换到裁剪空间
顶点着色:根据顶点信息进行着色计算
4.2可选着色器
曲面细分着色器:根据一定的规则/算法生成更多顶点,操作对象是顶点
几何着色器:根据给定的图元生成更多的图元,操作对象是图元
4.3裁剪
这一步是硬件上的固定操作,但是我们可以自定义一个裁剪操作来对这一步进行配置。
如果一个顶点的坐标超过了-W~W的范围,那么这个点就应该被裁剪掉。
如果一个图元的部分顶点被裁剪,那么还需要补全额外的顶点来补全这个图元。
4.4投影
这一步一般由硬件自动完成.
分为正交投影和透视投影,主要进行的操作是透视除法,将xyz分别除以W,透视除法之后就转换到标准设备坐标系(NDC,Normalized Device Coordinates)。Opengl中NDC的范围是(-1,-1,-1)~(1,1,1)。DX中(-1,-1,0)~(-1,-1,1)。
正交投影的过程中W始终为1,所以进行透视除法以后坐标都不会发生变化,因此并不会产生近大远小的效果。
透视投影的W是近处小远处大,进行透视除法以后就会有近大远小的效果。
4.5屏幕映射
将标准设备坐标系的坐标转换到屏幕坐标系中,屏幕坐标系是一个二维的坐标系,屏幕映射阶段不会对Z坐标进行任何变换,屏幕坐标系和z坐标一起构成了窗口坐标系,另外OpenGl的屏幕坐标系的原点一般在左下角,而DX的原点在左上角。
5.光栅化阶段
找到位于待渲染图元中的所有像素值,这个过程被叫做光栅化。
5.1三角形设置(图元装配)
’将顶点连接成三角形,得到三角形网格数据。几何处理阶段产生的各种着色数据的插值也是在这个阶段完成的,比如顶点颜色,位置,uv等等。
5.2三角形遍历
检查每个像素是否被三角网格覆盖,如果被覆盖的话就会生成一个片元。这个阶段会对三角形三个顶点上的属性进行插值,来获得每个片元的属性。包括片元的深度,以及几何处理阶段输出的相关着色数据。注意片元并不等同与像素,因为一个像素可能被多个三角形的不同片元所覆盖,经过像素处理阶段以后才会决定这些片元是否保留以及保留下来的如何进行混合。
6.像素处理阶段
光栅化阶段以后,就得到了所有被三角形覆盖的片元的系列。对序列中的每个片元进行逐个操作的过程就是逐片元操作。
6.1片元(像素)着色器
片元着色器的输入是光栅化阶段对顶点信息进行插值得到的结果,输出是一个或多个颜色值。(比如可以渲染到多个目标)。
6.2合并(逐片元操作)
这个阶段是高度可配置但不可编程的。
主要进行两个任务:1.进行各种测试决定片元的可见性
2.对于通过测试的片元,将片元的颜色与颜色缓冲区的颜色进行合并(混合)
一般来说测试的顺序是 透明度测试,模板测试,深度测试。
通过了测试的片元可以进行颜色混合,如果没有开启混合默认会覆盖掉颜色缓冲区的颜色。
7.参考:
TA100-renderpipeline-v2.1_哔哩哔哩_bilibili
Shader入门精要
RTR4