渲染优化

目前的SPR只使用了Forward rendering,抗锯齿使用的是MSAA,并且没有模型遮挡剔除优化,LOD也没有。这里给出一些自己的优化任务。

1 摄像机遮挡剔除

这个使用unity自带的Occlusion Culling就可以了,效果不错,对模型和灯光都适用,我已经测试过了。不过存在的问题是,CityEngine导出的城市街道和建筑等模型是经过实例化处理的,并且用于生成城市的模型在maya中Combine过,这样就不适合在Unity中进行最佳的遮挡剔除,据此处理一下就行。

这里演示一下Unity的Occlusion Culling怎么用。

勾选摄像机的Occlusion Culling功能:


Window/Rendering/Occlusion Culling打开。

可以在All过滤中手动选择要进行遮挡的物体,也可以在Renderers中过滤所有的网格物体来选择。最简单的方法是创建一个Occluson Area:

调整大小包围住整个场景:

注意要将所有参与这样的物体选中,保证Static中的Occluder StaticOccludee Static勾选。

最后在Bake中烘培一下就行:

注意光源是根据其作用范围来进行遮挡的,所以不用担心因为发光点被遮挡而消失。

我们可以在Visualization中选择摄像机来观察遮挡效果。

2 Shader优化

2.1 LOD

我们可以根据LOD级别编写不同的SubShader,让材质根据距离更换Shader,结构大概是:

SubShader
{
    ...
    LOD 200
    ...
}
SubShader
{
    ...
    LOD 100
    ...
}

unity会找到第一个LOD值小于等于Shader.globalMaximumLOD的SubShader进行计算,这是全局控制,还可以使用Shader.MaximumLOD来对单独某个Shader进行控制。

也就是说,一个网格物体离摄像机远到某种距离,我们可以降低尝试使用另一个低精度计算的subshader,例如使用更少的纹理。不过这个不太好支持,之后可以尝试一下,或者干脆不考虑。

2.2 Compute Shader

可以考虑将一些运算放在Compute Shader上进行,比如高斯模糊等。

3 管线优化

3.1 混合管线

考虑根据距摄像机距离,将物体分为远近两组,包括网格模型和光源,近处使用Forward Rendering,远处使用Deferred Rendering。不过问题在于Deferred Rendering要提前渲染大量的纹理,使用MSAA的话性能消耗太大了,针对这个问题考虑实现TAA之类的抗锯齿算法,或者干脆上FXAA去调效果。

3.2 优化管线

考虑制作的是夜景,就算将场景分为远近两组,近景的光源数还是挺多的,使用传统的Forward Rendering还是有点吃亏的。可以考虑使用Clustered/Tiled Forwarding Rendering来优化,也可以同理来优化Deferred Rendering。

推荐阅读更多精彩内容