功能定義與發展歷史

  • 定義: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 計算量。