unity相机支持多种渲染路径主要有三种:forward rendering path、deferred rendering path和vertex rendering path
而shader中的lightMode有:
1、Always:不管使用哪种渲染路径,该pass总会被渲染,但不会计算任何光照
2、ForwardBase:该pass会计算环境光、自发光和最重要的平行光(场景中最亮的平行光),和逐顶点的光源和SH光源
3、ForwardAdd:该pass会计算额外的逐像素光源,且每个pass对应一个光源
4、Deferred:
5、ShadowCaster:
相机中的renderingPath和shader中的lightMode对应的关系是:在相机中选择不同的rendering path时,shader中的运行的pass也是对应的,比如在forwardbase中的frag输出红色、deferred中的frag输出黄色,当相机选择forward rendering path时,当前shader对应的物体就是显示红色。
**
Forward渲染
有三种处理光照的方式:逐顶点处理、逐像素处理和SH处理。这三种方式的选择取决于两点:光源的类型(是否是平行光?)光源的渲染模式(是否important)
因此总结了以下的规律供参考
首先按照光源的重要性(距离物体的远近和光源的强度)排行,如果有光源选取了important则排在前面,选取上述图片中pixel light count中的数目的光源作为逐像素处理,之后最多4个光源按照逐顶点处理,剩下的光源按照SH处理。
在pass中进行光照计算
forwardPass分为两种:
1、ForwardBase
2、ForwardAdd
在BasePass中会进行一个逐像素的平行光(最亮的平行光)、所有逐顶点的光源和SH光源的光照计算(可实现的光照效果包括:光照纹理、环境光、自发光和阴影),并且每个BasePass只会执行一次。
在AdditionalPass中会进行其他的逐像素光源的光照计算,每个光源都会执行一次AddPass。
值得注意的是:
1、因为BasePass中的个平行光是默认支持阴影的,而AddPass中渲染的光源是默认没有阴影的,因此添加
#pragma multi_compile_fwdadd_fullshadows编译指令来代替
#pragma multi_compile_fwdbase(有了这条编译指令保证光照衰减等光照变量可以被正确赋值)
2、在AddPass中我们需要添加Blend One One指令来开启混合模式。