Unity自5.0版本更新后,最常用的渲染路径有两个,一个是前向渲染ForwardRenderingPath,另一个是延迟渲染路径DeferredRenderingPath,而顶点照明渲染路径由于功能上已经被前向渲染覆盖,故目前已经是遗留状态。
前向渲染路径可以理解为直接计算该模型的渲染图元,并计算颜色缓冲区和深度缓冲区的信息。深度缓冲区决定片元是否可见,颜色缓冲区决定片元最终呈现的效果。在一个有多个逐像素光源影响的场景内,我们需要分别使用不同的Pass来计算不同的逐像素光源,并把这些不同的光照结果在帧缓冲中混合,得到最后的效果。
既然说到光源的逐像素处理,那么Unity的前向渲染路径对于光照的处理方式有三种:分别是逐顶点处理、逐像素处理和球谐函数(SH处理)。决定使用哪种方式取决于光源的类型和渲染模式,其中最关键的就是光源的渲染模式是否设定为IMPORTANT,这在光源的属性面板中RenderMode中可以勾选。对于光照的处理原则见下:
1)场景中最亮的 平行光 总是按逐像素处理的。
2)渲染模式被标记为Not Important的光源会被逐顶点和SH处理
3)渲染模式被设置成Important的光源会被逐像素处理
4)如果根据以上规则得到的逐像素光源少于QualitySetting中的逐像素光源数量PixelLightCount,会有更多的光源以逐像素的方式进行渲染
前向渲染的实际操作
在选择前向渲染路径Shader的实际操作中,通常会使用两种Pass来处理,分别是BasePass和AdditionalPass,这两种Pass在渲染设置、光照选择计算和可实现的效果上均有所不同。
1.渲染设置
BassPass在渲染设置时需要采用以下代码:
Tags {"LightMode" = "ForwardBase" }
#pragma multi_compile_fwdbase
AddtionalPass在渲染设置时采用以下代码
Tags {"LightMode" = "ForwardAdd" }
Blend One One //AP必须手动开启混合模式
#pragma multi_compile_fwdadd
其中Tags部分将告诉Unity您的这个Pass将会是前向渲染中的哪个部分,方便Unity在后台布置不同的内置光照变量和函数。
而 #pragma multi_compile_fwdbase/fwdadd编译指令保证在具体的Pass可以得到正确的光照变量。
重点说明的是,由于AdditionalPass会处理多个逐像素光源,故必须开启混合模式Blend,否则将会导致输出的颜色结果覆盖而不是混合。
2.光照选择计算
BP和AP在光照处理的选择上是有所分工的,BP主要承担一个逐像素平行光以及其他所有逐顶点和SH光源的计算,通常情况下只调用一次(个别情况例外,比如需要半透明物体的双面渲染)。而AP则负责处理其他的逐像素光源,且每个逐像素光源都会调用一次AP。
3.可实现效果
BP可以实现的效光照效果有:光照纹理、环境光、自发光、阴影(平行光阴影)。由于对于场景中的物体而言,环境光和自发光通常只希望被计算一次,故放在BP中计算是最好的,如果放在AP中会导致重复计算叠加;BP默认支持阴影,在开启了光源的阴影功能后不需要做额外的设置。
AP主要的工作还是在多逐像素光源的计算上,并且默认不支持阴影效果,但是可以通过使用以下指令开启:
#pragma multi_compile_fwdadd_fullshadows
之前提过,选择不同的渲染路径,Unity会根据不同的Tags配置具体的光照变量和函数给Shader,以下是Shader可以访问的内置光照变量和内置光照函数
内置光照变量
内置光照函数