Unity 5.4.1f1相机渲染顺序异常问题求助
我在Unity 5.x版本里碰过好几次这类诡异的渲染顺序问题,看似depth设置正确但实际渲染顺序完全不对,大概率是这些细节没注意到,你可以逐一排查:
先确认Depth值的逻辑没搞反:Unity里相机的
depth数值越高,渲染顺序越靠后(也就是最后渲染)。别把数值设反了——比如其他相机depth是0,你的后期相机要设成大于所有其他相机的数值(比如10),而不是负数或者更小的数。可以在Inspector里把所有相机的depth列出来对比,确保后期相机是最高的那个。检查是否有脚本动态修改Depth值:很多时候是代码里不小心覆盖了Inspector的设置。比如有些初始化脚本、状态切换脚本里,可能写了
camera.depth = -1或者其他固定值,运行时直接改掉了你设置的数值。你可以在运行时锁定Inspector的相机面板,看看depth值是不是和你设置的一致;或者在Profiler的Frame Debugger里,查看每帧相机的渲染顺序和对应的depth值,确认后期相机的depth确实是最高的。检查相机的Clear Flags设置:这是最容易踩坑的点!如果你的后期特效相机是用来渲染叠加在场景上的特效物体,那它的Clear Flags应该设为Depth Only或者Don't Clear,而不是Skybox/Solid Color。因为如果后期相机先渲染,且Clear Flags设为清空屏幕,后面主相机渲染时会再次清空并覆盖掉它的内容,自然看不到特效。选Depth Only的话,它只会渲染自己Culling Mask里的物体,不会清空前面相机的渲染结果。
确认Culling Mask和渲染层的匹配:把你的后期特效物体单独放在一个层(比如
PostEffects)里,然后后期相机的Culling Mask只勾选这个层,其他相机的Culling Mask不勾选这个层。这样只有后期相机会渲染这些特效物体,而且最后渲染的话就会叠加在最上层。如果其他相机也勾选了这个层,特效物体会被提前渲染,可能被场景物体遮挡。检查相机的Rendering Path设置:Unity 5.4里,如果主相机用的是Deferred Rendering Path,而后期相机用的是Forward,偶尔会出现渲染顺序不符合depth的情况。你可以把两个相机的Rendering Path设成一致(比如都设为Forward),看看是不是能解决问题。
用Frame Debugger排查具体流程:Unity 5.4已经自带Frame Debugger了(Window > Frame Debugger),打开它逐帧查看渲染顺序,看看你的后期相机到底是在哪个阶段渲染的,以及后面有没有其他相机覆盖了它的渲染结果。这个工具能直观看到每一步的渲染内容,定位问题特别快。
如果以上都试过还是不行,你可以检查一下有没有使用第三方相机管理或后期处理插件,有些插件会强制修改相机的渲染顺序,这时候需要去插件的设置里调整优先级。
内容的提问来源于stack exchange,提问作者user5081698

