【從UnityURP開始探索遊戲渲染】專欄-直達
Universal Additional Camera Data 組件概述
在 Unity Universal Render Pipeline (URP) 中,UniversalAdditionalCameraData 組件是擴展標準相機功能的核心組件,它提供了 URP 特有的相機配置選項。每個 URP 相機都會自動附加這個組件。
自定義相機的主要配置項
渲染類型 (Render Type)
- Base: 主相機類型,可以獨立渲染或作為其他疊加相機的基礎
- Overlay: 疊加相機,必須附加到 Base 相機上才能工作
- ScreenSpaceOverlay: 屏幕空間疊加,用於UI等元素
堆棧相機系統 (Camera Stack)
- 允許將多個 Overlay 相機疊加到 Base 相機上
- 渲染順序由相機的 Depth 值決定
- 每個疊加相機可以有自己的清除標誌和剔除遮罩
後期處理控制
- 可以單獨啓用/禁用後期處理效果
- 控制抗鋸齒方式
- 設置渲染比例(Render Scale)
高級渲染設置
- 控制是否渲染陰影
- 設置Opaque Texture和Depth Texture的生成
- 配置運動矢量(Motion Vectors)
自定義相機原理
URP 的自定義相機系統基於以下核心原理:
- 分層渲染架構:Base 相機負責基礎場景渲染,Overlay 相機提供額外的渲染層
- 渲染紋理複用:URP 會智能地複用中間渲染紋理,減少內存佔用
- 後期處理組合:每個相機可以有自己的後期處理效果,URP 會按順序組合它們
- 剔除優化:URP 會根據相機的視錐體和剔除遮罩優化渲染調用
具體使用示例
創建基礎相機並添加疊加相機
// 獲取或創建主相機
Camera mainCamera = Camera.main;
var mainCameraData = mainCamera.GetUniversalAdditionalCameraData();
// 設置相機屬性
mainCameraData.renderType = CameraRenderType.Base;
mainCameraData.requiresColorTexture = true;
mainCameraData.requiresDepthTexture = true;
// 創建疊加相機
GameObject overlayCamObj = new GameObject("EffectCamera");
Camera overlayCam = overlayCamObj.AddComponent<Camera>();
var overlayCamData = overlayCam.GetUniversalAdditionalCameraData();
// 配置疊加相機
overlayCamData.renderType = CameraRenderType.Overlay;
overlayCam.clearFlags = CameraClearFlags.Depth;
overlayCam.cullingMask = LayerMask.GetMask("Effects");
// 添加到主相機堆棧
mainCameraData.cameraStack.Add(overlayCam);
高級自定義相機配置
// 創建特殊用途相機
Camera specialCamera = new GameObject("SpecialCamera").AddComponent<Camera>();
var specialCameraData = specialCamera.GetUniversalAdditionalCameraData();
// 詳細配置
specialCameraData.renderType = CameraRenderType.Base;
specialCameraData.renderPostProcessing = true;
specialCameraData.antialiasing = AntialiasingMode.FastApproximateAntialiasing;
specialCameraData.antialiasingQuality = AntialiasingQuality.Low;
specialCameraData.requiresColorOption = CameraOverrideOption.On;
specialCameraData.requiresDepthOption = CameraOverrideOption.On;
specialCameraData.stopNaN = true;
specialCameraData.dithering = true;
// 設置目標紋理
specialCamera.targetTexture = RenderTexture.GetTemporary(1024, 1024, 24);
動態修改相機堆棧
// 獲取主相機數據
var mainCamData = Camera.main.GetUniversalAdditionalCameraData();
// 動態添加疊加相機
Camera dynamicOverlay = new GameObject("DynamicOverlay").AddComponent<Camera>();
dynamicOverlay.GetUniversalAdditionalCameraData().renderType = CameraRenderType.Overlay;
mainCamData.cameraStack.Add(dynamicOverlay);
// 動態移除疊加相機
mainCamData.cameraStack.Remove(dynamicOverlay);
渲染紋理監控系統
- 創建渲染紋理資源在Project窗口右鍵選擇Assets > Create > Render Texture,命名為"SecurityFeed",分辨率設為1024x1024。
- 配置渲染相機創建名為"SecurityCamera"的相機,將SecurityFeed拖入Output Texture屬性,調整視角對準監控區域。
-
顯示監控畫面創建Quad對象並附加材質,將SecurityFeed賦給材質的Base Map,通過主相機觀察Quad。
- 支持多路監控畫面切換
- 通過數組管理不同區域的渲染紋理
- 可擴展為自動巡邏系統
-
SecurityCameraController.cs
using UnityEngine; using UnityEngine.Rendering.Universal; public class SecurityCameraController : MonoBehaviour { public RenderTexture[] securityFeeds; private Camera securityCam; private int currentFeedIndex; void Start() { securityCam = GetComponent<Camera>(); securityCam.targetTexture = securityFeeds[0]; } public void SwitchFeed(int index) { securityCam.targetTexture = securityFeeds[index]; } } -
UICameraStack.cs
void Start() { var uiCamera = GameObject.Find("UICamera").GetComponent<Camera>(); var mainCameraData = Camera.main.GetUniversalAdditionalCameraData(); mainCameraData.cameraStack.Add(uiCamera); } -
ZoomBlurFeature.cs
public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData) { if (zoomMaterial == null) return; blurPass.Setup(renderer.cameraColorTarget, zoomMaterial); renderer.EnqueuePass(blurPass); }
實際應用場景
- 分屏遊戲:為每個玩家創建獨立的Base相機
- 畫中畫效果:使用額外的Base相機渲染到紋理
- UI特效:通過Overlay相機添加屏幕空間特效
- 後處理組合:不同相機應用不同的後期處理效果
- 優化渲染:通過禁用不需要的功能提高性能
注意事項
- 疊加相機的Depth值必須大於其Base相機的Depth值
- 過多的疊加相機會影響性能,應合理使用
- 自定義相機的清除標誌需要仔細配置以避免意外清除
- 在VR中,每個相機都會為每隻眼睛渲染一次,需特別注意性能
- 相機堆棧中的順序會影響最終渲染結果
【從UnityURP開始探索遊戲渲染】專欄-直達
(歡迎點贊留言探討,更多人加入進來能更加完善這個探索的過程,🙏)