渲染管线参考视频
一、应用程序:-准备基本场景数据-加速算法粗粒度剔除-设置渲染状态-调用DrawCall输出渲染图元到显存
1.基本场景数据包括:物体位置/网格;光源信息类型/位置(设置阴影逐光源绘制阴影贴图);相机参数
2.加速算法粗粒度剔除:可见光裁剪;可见场景裁剪(八叉树,BSP/K——D树,BVH)
3.渲染设置:绘制设置(使用着色器,合批方式);绘制物体顺序(相对摄像机距离,渲染队列,UI设置)渲染目标(输出到帧缓存或渲染贴图);渲染模式(前项渲染/延迟渲染)
/*
1.CPU将数据加载到显存:顶点位置信息,法线方向,顶点颜色,uv坐标
2.设置渲染状态:使用哪个顶点着色器,片元着色器,光源属性材质等
3.调用Draw Call:由CPU发起命令GPU渲染图像。指向一个需要被渲染的图元列表(以传入显存中)。
*/
二、几何阶段:顶点着色器-曲面细分着色器-几何着色器-投影-裁剪-屏幕映射
其中曲面,几何着色器可选分别用于细分图元,着色或产生新图元(网格细分/粒子点生成新图元)。。最后屏幕映射,将顶点坐标转换到屏幕坐标系中。
顶点着色器:将顶点坐标从模型空间转换到齐次裁剪空间
如:v2f.pos = UnityObjectToClipPos(a2v.pos); 或 mul(UNITY_MVP, a2v.pos)//通过MVP矩阵转换得到齐次裁剪坐标,
投影:再由硬件做透视除法,得到设备坐标NDC(OpenGL中z分量[-1,1],DX中[0,1])。
裁剪:CVV剔除视平面外的顶点,正面/背面剔除可配置
屏幕映射:将每个图元的x,y坐标(不对z进行操作)转换到屏幕坐标系下/OpenGL从左下到右上,DX从左上到右下,实际上屏幕坐标系与z坐标组成窗口坐标系,这些值一起被传递到光栅化阶段。

三、光栅化阶段:三角形设置-三角形遍历-片元着色器-逐片元操作(计算每个图元覆盖了那些像素,计算着些像素的颜色)
三角形设置:计算光栅化一个三角形所需的信息
三角形遍历:检查每个像素是否被一个三角形覆盖,如果都被一个三角形所覆盖,就会生成一个片元。同时也会根据三个顶点信息对所覆盖的像素的深度插值计算。这一阶段也称扫描变换。即输出是一系列片元序列(包含很多状态集合:屏幕坐标,深度信息及顶点信息)。(抗锯齿MSAA:1.SSAA:渲染到放大n倍的buffer然后对其采样。2.MSAA:只有此方式在光栅化阶段,计算多个覆盖样本。3.FXAA/TXAA:后处理技术不再此阶段)
片元着色器:颜色插值,纹理采样(此时的片元并不是真正意义上的像素)
逐片元操作(输出合并阶段):主要进行片元可见性判断和颜色混合
透明测试:有时会与提前测试发生冲突。API:clip(tex.r-_Cutoff);
模板测试:(蒙版/遮罩)
参考视频




深度测试:(可以指定是否开启深度测试与深度写入)与深度缓冲区中的值进行对比,小于深度缓冲中的值(更近)时有权利是否写入Z-Buffer。(Early-Z提前执行)
合并:得到的目标颜色根据是否进行混合,半透明物体-与颜色缓冲区中的颜色值进行混合得到新颜色,或直接覆盖原颜色缓冲区中的颜色。