Unity HDRP 多摄像机分层渲染

新版 Unity引入了全新的 HDRP(High Definition Render Pipeline)渲染管线,开发者从此可以更加愉快的添加各类屏幕后预设效果。官方文档位置如下:

https://docs.unity3d.com/Packages/com.unity.render-pipelines.high-definition@8.2/manual/index.html

例如,添加一个全局的Bloom效果只需要在菜单中选择一个预设组件即可,比以前方便太多。

 

不过实际使用过程中还是遇到了一个问题:

虽然Volume组件中可以选择全局(Global)或者局部(Local)的渲染方式,但Local方式并不能按层来进行后处理,而是需要在每一个待渲染的预制体上都挂载一个触发器(Trigger)来进行识别,

然而大部分实际的开发情况是,只需要将不进行后处理的预制体筛选出来单独放在一层渲染即可,其余正常进行后处理的场景物体不做任何特殊处理。

那么有没有办法按层而不是仅仅只能按物体来区分渲染呢?

查阅了官方文档和网上资料后,发现了一种十分简单的实现方式——用两个摄像机分别渲染。

 

基本思路为:

对两个摄像机的Culling Mask属性中各自需要渲染的层进行区分,并使其中一个摄像机打开后处理的开关,另一个摄像机不打开。

 

以UI层为例,实际上有一些场景中的3D UI并不需要任何的屏幕后效果;如果开全局Bloom,UI的设计效果会受到很大影响,但如果用Local模式,策划就需要每个关卡添加触发器结果可能当场吐血。

为了避免如上惨剧发生,可以建立一个单独渲染场景UI的摄像机与主摄像机进行区分,并将UI摄像机Transform复位后挂载到主摄像机的子节点下。

 

主摄像机A设置如下:

UI 摄像机B设置如下:

 

 

Stack为摄像机的渲染栈,栈渲染即不用一个摄像机来渲染所有内容,而使用多个相互堆叠的摄像机来实现层级式帧渲染的方式。

并且在摄像机的渲染栈中可以很方便的取得其他关联摄像机的信息,只需要引入如下命名空间即可:

using UnityEngine.Rendering.Universal;

例如我们可以很方便的对UI摄像机与主摄像机实现数据同步:

        //设置UI摄像机与主摄像机保持同步
        var uiCamera = Camera.GetComponent<UniversalAdditionalCameraData>().cameraStack[0];
        uiCamera.orthographic = Camera.orthographic;
        uiCamera.fieldOfView = CameraFOV;
        uiCamera.orthographicSize = OrthographicSize;
        uiCamera.nearClipPlane = NearClipPlane;
        uiCamera.farClipPlane = FarClipPlane;
        //...
posted @ 2021-02-02 13:36  汐夜  阅读(3560)  评论(0编辑  收藏  举报