博客 / 詳情

返回

【URP】Unity[相機]自定義相機

【從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開始探索遊戲渲染】專欄-直達
(歡迎點贊留言探討,更多人加入進來能更加完善這個探索的過程,🙏)
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.