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;
        //...


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM