【从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 在
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 2lightSource.renderingLayerMask = 1 << 2;// 设置物体仅接受 Layer 2 的光照targetRenderer.renderingLayerMask = 1 << 2;} }
实际用例
- 解密游戏:火把仅照亮可交互物体(Layer3),环境物体(Layer1)不受影响。
- 角色特效:技能光源(Layer4)仅作用于自身和敌人,避免干扰场景光照。
- 性能敏感场景:动态禁用远处灯光的渲染层,减少 Shader 计算量。
【从UnityURP开始探索游戏渲染】专栏-直达
(欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,🙏)
Unity URP 的 Rendering Layers(渲染层)功能是一种精细控制光照影响的机制,允许开发者通过层掩码(Layer Mask)将特定光源与特定 GameObject 关联,实现选择性