功能定義與發展歷史
- 定義: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)。
參數含義
|
參數
|
作用
|
用例
|
|
|
光源影響的層
|
聚光燈僅照亮 "Enemy" 層
|
|
|
物體受光層
|
角色材質僅響應 "PlayerLight" 層
|
|
|
每物體最大受光數
|
限制移動端每物體最多 4 盞燈
|
底層原理
- 渲染階段:URP 在
RenderingOpaques或RenderingTransparents階段,根據 Layer Mask 篩選光源與物體匹配關係。 - Shader 處理:在着色器中,通過
_LightLayerMask變量與物體層掩碼進行位運算,剔除不匹配的光照計算。 - 性能優化:通過
Culling Mask減少 GPU 提交的燈光數據量。
原理示例
假設光源掩碼為 0010(Layer2),物體掩碼為 0101(Layer1+Layer3):
- 位與運算:
0010 & 0101 = 0000→ 無匹配,物體不受光。 - 若物體掩碼改為
0010,則運算結果為0010→ 受光。
此機制通過 GPU 的逐像素計算實現高效篩選,避免 CPU 端遍歷所有光源
完整示例
以下代碼演示如何通過腳本動態修改 Rendering Layers:
- 功能説明:
- 使用
Light2D或UniversalAdditionalLightData組件配置光源層。 - 通過位運算(
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 計算量。