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可以访问的内置光照变量和内置光照函数

unity寻路烘焙_混合模式

内置光照变量

 

unity寻路烘焙_unity寻路烘焙_02

内置光照函数