博客 / 詳情

返回

【URP】Unity渲染層Rendering Layers

【從UnityURP開始探索遊戲渲染】專欄-直達

Unity URP 的 Rendering Layers(渲染層)功能是一種精細控制光照影響的機制,允許開發者通過層掩碼(Layer Mask)將特定光源與特定 GameObject 關聯,實現選擇性照明。

‌功能定義與發展歷史‌

  • 定義‌:Rendering Layers 是 URP 基於 HDRP 的 Light Layers 功能演化而來的輕量化實現,通過位掩碼(32 位)控制光源與物體的匹配關係。
  • 發展‌:

    • HDRP 起源‌:最初在 HDRP 中引入,用於影視級光照控制(如僅讓特定燈光影響角色)。
    • URP 適配‌:URP 12.0+ 版本整合此功能,簡化了實現邏輯,更適合移動端和跨平台項目。

‌核心作用‌

  • 性能優化‌:避免不必要的燈光計算(如場景中大量燈光僅需影響少數物體)。
  • 藝術控制‌:實現局部光照效果(如角色高光與環境光分離)。
  • 動態交互‌:實時切換燈光影響目標(如開關謎題中的燈光區域)。

‌實現流程與參數詳解‌

‌啓用功能‌

  • URP Asset 配置‌:在 URP 資源中勾選 Light Layers 選項。
  • 光源設置‌:為光源指定 Rendering Layer Mask(如 Layer1)。
  • 物體設置‌:在 Mesh Renderer 的 Rendering Layer Mask 中選擇匹配層(如 Layer1)。

‌參數含義‌

參數 作用 用例
Light Layer Mask 光源影響的層 聚光燈僅照亮 "Enemy" 層
Renderer Layer Mask 物體受光層 角色材質僅響應 "PlayerLight" 層
Additional Lights Per Object 每物體最大受光數 限制移動端每物體最多 4 盞燈

‌底層原理‌

  • 渲染階段‌:URP 在 RenderingOpaquesRenderingTransparents 階段,根據 Layer Mask 篩選光源與物體匹配關係。
  • Shader 處理‌:在着色器中,通過 _LightLayerMask 變量與物體層掩碼進行位運算,剔除不匹配的光照計算。
  • 性能優化‌:通過 Culling Mask 減少 GPU 提交的燈光數據量。

‌原理示例‌

假設光源掩碼為 0010(Layer2),物體掩碼為 0101(Layer1+Layer3):

  • 位與運算‌:0010 & 0101 = 0000 → 無匹配,物體不受光。
  • 若物體掩碼改為 0010,則運算結果為 0010 → 受光。

此機制通過 GPU 的逐像素計算實現高效篩選,避免 CPU 端遍歷所有光源


‌完整示例‌

以下代碼演示如何通過腳本動態修改 Rendering Layers:

  • 功能説明‌:

    • 使用 Light2DUniversalAdditionalLightData 組件配置光源層。
    • 通過位運算(1 << n)快速切換層掩碼。
  • LightLayerController.cs

    using UnityEngine;
    using UnityEngine.Rendering.Universal;
    
    public class LightLayerController : MonoBehaviour
    {
        public Light2D lightSource;
        public MeshRenderer targetRenderer;
    
        void Start()
        {
            // 設置光源僅影響 Layer 2
            lightSource.renderingLayerMask = 1 << 2;
    
            // 設置物體僅接受 Layer 2 的光照
            targetRenderer.renderingLayerMask = 1 << 2;
        }
    }

‌實際用例‌

  • 解密遊戲‌:火把僅照亮可交互物體(Layer3),環境物體(Layer1)不受影響。
  • 角色特效‌:技能光源(Layer4)僅作用於自身和敵人,避免干擾場景光照。
  • 性能敏感場景‌:動態禁用遠處燈光的渲染層,減少 Shader 計算量。

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

發佈 評論

Some HTML is okay.