美文网首页
渲染优化

渲染优化

作者: Dragon_boy | 来源:发表于2021-02-22 23:01 被阅读0次

    目前的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。

    相关文章

      网友评论

          本文标题:渲染优化

          本文链接:https://www.haomeiwen.com/subject/mqqlfltx.html