目前的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 Static
和Occludee 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。
网友评论