【從UnityURP開始探索遊戲渲染】專欄-直達
URP 相機渲染類型概述
在 Unity Universal Render Pipeline (URP) 中,相機組件提供了多種渲染類型選項,用於控制相機如何參與渲染流程。這些類型決定了相機是否渲染、如何與其他相機交互以及渲染結果的用途。
主要渲染類型及其用途
Base(基礎)
用途:這是默認的渲染類型,用於渲染遊戲世界的主要視圖。Base 相機通常作為場景中的主相機使用。
特點:
- 渲染到屏幕或渲染紋理
- 可以與其他 Base 相機疊加(通過相機的 Depth 屬性控制渲染順序)
- 支持後期處理效果
使用示例:
csharp
// 創建一個基礎相機
Camera mainCamera = gameObject.AddComponent<Camera>();
var urpCameraData = mainCamera.GetUniversalAdditionalCameraData();
urpCameraData.renderType = CameraRenderType.Base;
Overlay(疊加)
用途:用於在 Base 相機渲染的內容之上疊加額外的內容,常用於UI、特效或特殊視覺效果。
特點:
- 不能單獨渲染,必須疊加在 Base 相機上
- 可以疊加多個 Overlay 相機到一個 Base 相機
- 渲染順序由相機的 Depth 屬性控制
- 可以有自己的後期處理效果
使用示例:
csharp
// 創建一個疊加相機用於UI
Camera uiCamera = new GameObject("UICamera").AddComponent<Camera>();
var urpCameraData = uiCamera.GetUniversalAdditionalCameraData();
urpCameraData.renderType = CameraRenderType.Overlay;
// 將疊加相機添加到主相機
mainCamera.GetUniversalAdditionalCameraData().cameraStack.Add(uiCamera);
ScreenSpaceOverlay(屏幕空間疊加)
用途:類似於舊版Unity的Screen Space - Overlay模式,用於UI渲染。
特點:
- 渲染順序在所有其他相機之後
- 不受場景光照影響
- 適合用於傳統的UI系統
使用示例:
csharp
// 創建一個屏幕空間疊加相機
Camera uiOverlayCamera = new GameObject("UIOverlayCamera").AddComponent<Camera>();
var urpCameraData = uiOverlayCamera.GetUniversalAdditionalCameraData();
urpCameraData.renderType = CameraRenderType.ScreenSpaceOverlay;
相機組合使用示例
基礎+疊加相機組合
csharp
// 主相機(Base)
Camera mainCam = Camera.main;
var mainCamData = mainCam.GetUniversalAdditionalCameraData();
mainCamData.renderType = CameraRenderType.Base;
// 特效疊加相機(Overlay)
Camera effectCam = new GameObject("EffectCamera").AddComponent<Camera>();
effectCam.clearFlags = CameraClearFlags.Depth;
var effectCamData = effectCam.GetUniversalAdditionalCameraData();
effectCamData.renderType = CameraRenderType.Overlay;
// 將特效相機添加到主相機的堆棧中
mainCamData.cameraStack.Add(effectCam);
多相機渲染順序控制
csharp
// 主相機
Camera mainCamera = Camera.main;
mainCamera.depth = 0;
// 後處理特效相機
Camera postEffectCamera = new GameObject("PostEffectCamera").AddComponent<Camera>();
postEffectCamera.depth = 1;
var postEffectData = postEffectCamera.GetUniversalAdditionalCameraData();
postEffectData.renderType = CameraRenderType.Overlay;
// UI相機
Camera uiCamera = new GameObject("UICamera").AddComponent<Camera>();
uiCamera.depth = 2;
var uiCameraData = uiCamera.GetUniversalAdditionalCameraData();
uiCameraData.renderType = CameraRenderType.Overlay;
// 添加到堆棧(順序由depth決定)
mainCamera.GetUniversalAdditionalCameraData().cameraStack.Add(postEffectCamera);
mainCamera.GetUniversalAdditionalCameraData().cameraStack.Add(uiCamera);
注意事項
- 性能考慮:每個Overlay相機都會增加額外的渲染開銷,應儘量減少Overlay相機的數量。
- 清除標誌:Overlay相機通常應設置為
CameraClearFlags.Depth或CameraClearFlags.Nothing,以避免清除Base相機的內容。 - 後期處理:Base相機和Overlay相機可以有不同的後期處理效果,但要注意性能影響。
- 渲染紋理:Base相機可以渲染到紋理,Overlay相機也可以疊加到這些紋理上。
- VR支持:在VR中,Overlay相機會為每隻眼睛渲染一次,需要注意性能問題。
【從UnityURP開始探索遊戲渲染】專欄-直達
(歡迎點贊留言探討,更多人加入進來能更加完善這個探索的過程,🙏)