在Unity3d中,我们可以使用Deferred Light(延迟灯光)来快速高效的实现多个光源的动态纹理映射和阴影效果。Deferred Light一般与摄像机有关,我们可以设置Camera里面的Rendering Path为Deferred Light。当然我们也可以在Build Settings下的Player Settings中设置默认的Rendering Path为Deferred Light。在使用Deferred Light的情况下,所有的光照都是逐像素计算,可以与法线贴图正确交互。所有的光都有它们各自的cookies和阴影。因为它是逐像素计算光照,所以图形不会像顶点着色那样锯齿明显,不真实。使用Deferred Light的影响取决于物体受光源影响的数量,而不是场景的复杂度。小面积的点光源或聚光灯,或光源被部分或完全摭挡,可以在很好的降低性能开销。有阴影的光源开销更大,在Deferred Rendering中,受到投影光源影响的,且可投影的物体依然是要对影响其的每个投影光源都进行计算。具有阴影的光照Shader也肯定比没有阴影的开销更大。而且,Deferred Light不支持抗锯齿以及半透明物体(半透明物体采用 Forward Rendering 渲染路径)。
1. Base Pass:首先计算屏幕空间缓冲信息:depth, normal,和specular power;
2.Lighting pass: 使用上面的缓冲信息在其他的缓冲区计算光照;
3.Final pass: 物体再次渲染,获取上面计算的光照和贴图再加上环境光/自发光等等混合在一起。如果物体的shader不能用light prepass处理,则会用forward rendering处理。
Base Pass 在这个pass中先渲染一遍物体,把view space的 normal和 specular power存在一张 ARGB32 Render Texture中,normal使用agb通道,specular使用a通道。Base Pass的结果就是把场景信息和一张 Render Texture填充在z buffer中。 Lighting Pass Lighting Pass就是通过depth,normal和specular power计算光照。光照在screen space进行计算,所以消耗与需要计算的时间不取决于场景复杂程度。光照缓冲信息存在一张 ARGB32 Render Texture中,它包括漫反射光照在rgb通道,高光强度在a通道。光照值用 logarithmic encode可以有更好的动态范围。当camera 的HDR选项被选择,光照缓冲信息使用ARGBHalf 格式,不使用 logarithmic encode。 final pass 所有物体再一次全部渲染,获取光照并与贴图和环境光混合计算。Lightmaps也在final pass中使用。相机离得近的地方进行实时光照,只烘焙 indirect lighting。相机离得远的地方,光全部烘焙。