目录
渲染路径
在Unity中,需要为每个Pass用LightMode标签指定它使用的渲染路径(Rendering path):
前向渲染 (Forward Rendering)
前向渲染的原理是:有两个缓冲区,利用深度缓冲区来决定一个片元是否可见,如果可见就更新颜色缓冲区中的颜色值,用伪代码表示如下:
Pass {
for (each primitives in this model) {
for (each fragment covered by this primitive) {
if (failed in depth test) {
discard;
} else {
// 通过深度测试则更新颜色缓冲区
float4 color = Shading(materialInfo, pos, normal, lightDir, viewDir);
writeFrameBuffer(fragment, color);
}
}
}
}
对于每个逐像素光源,如果场景中有N个物体,每个物体受M个光源影响,渲染整个场景需要N*M个Pass,计算量很大。
在Unity中,前向渲染有3种处理光照(照亮物体)的方式:逐顶点、逐像素、球谐函数(Spherical Harmonics, SH)。处理模式取决于光源类型和渲染模式,渲染模式指的是重要程度important/not important。
当渲染一个物体时,Unity会给光源作重要性排序,最多有4个光源逐顶点处理,剩下的光源按SH处理。判断规则如下:
- 最亮的平行光按逐像素处理
- Not important渲染模式会按逐顶点或者SH处理
- Important 渲染模式按逐像素处理
- 根据以上规则得到的逐像素光源小于Quality Setting中的逐像素光源数量(Pixel Light Count),会有更多光源按逐像素处理
前向渲染有两种Pass:
前向渲染可以使用的内置光照变量:
可以使用的光照函数:
顶点照明渲染 (Vertex Lit Rendering)
顶点照明渲染配置要求低、运算性能最高,但同时得到的效果比较差,它不支持逐像素的效果,如阴影、法线映射、高精度高光反射。它是前向渲染的一个子集。
Unity中的顶点照明渲染通常在一个Pass中就可以完成。在这个Pass中,会计算所有光源对该物体的照明(逐顶点)。它在Unity5以上的版本中&#