
Unity URP 渲染中的灯光数量设置 --- 场景、使用方法与渲染原理详解
随着游戏渲染技术的发展,渲染流水线(Rendering Pipeline)的灵活性和渲染效果成为衡量游戏表现力和渲染负担的重要标尺。Unity 的渲染流水线从最初内置渲染(Built-in pipeline)、到轻量渲染流水线(LWRP)、再到通用渲染流水线(URP, Universal RP),经历了重大转变。这种转变为渲染提供更多的可控性和扩展性,但是其中很多环节需要开发者了解其中的实现原理,做到有的放矢地进行渲染设置。
其中,渲染时每个物体最多可以受到多少灯光的作用,是渲染设置中一个非常关键且容易被忽视的数据。这一设置实际上对渲染负担、渲染效率、渲染发生的渲染次数(Pass数)、渲染出的渲染效果都有重大作用。
一、应用场景
你是不是有以下这种渲染方面的挑战?
- 游戏中需要渲染很多灯(比如火把、路灯、弹道火焰、爆炸)
- 需要为每个物体提供足够的灯光信息(比如法线信息)
- 渲染负担导致渲染帧数下降(fps drop)
若你碰到上述问题,你很有可能需要了解 URP 的每物体灯光数设置。这一设置决定了渲染时每个渲染物体可以获取多少附加灯信息。这又对渲染负担、渲染消耗、渲染结果的准确性产生重大影響。
比如:
- 大型室内场景:每时刻有很多不同区域需要不同灯光渲染。
- 移动游戏:渲染资源有限,需要对灯数进行限制。
- 电影渲染:需要渲染出富有层次且真实的灯光效果。
二、渲染原理
在 URP 渲染中:渲染时每个渲染物体实际上需要对作用到它身上的灯进行一定次数的渲染计算。这种渲染是按每物体进行(Per-object lighting),每渲染一个渲染物体时:
- URP 只会对其中最亮且最近(最有作用)的若干灯进行渲染。
渲染时每渲染物体可以获取到多少灯呢?
- 由 Additional Lights Per Object 控制。
比如:若此设置为 4,则渲染时每个渲染物体最多只对 4 盏附加灯进行渲染。这一限制主要是为了:
- 控制渲染时需要进行多少次 lighting 计算。
- 避免 GPU 负担增加。
渲染过程简述:
- URP 渲染时为每个渲染物体准备好一组最优(最亮且最近)的灯。
- 渲染时对每一个渲染物体依序对每一盏灯进行光照计算。
若灯数设置为 0,则渲染时只会渲染主灯(比如 Directional Light) ,渲染负担最轻,但是渲染出的效果缺少层次。若设置为 16,则渲染出的场景灯火辉煌,更有层次,但是渲染负担也显著增加。
-
渲染负担:
每渲染一个物体时需要为每一灯进行渲染计算。这种计算是乘法 :渲染负担 = 渲染物体数 * 每物体渲染灯数
若渲染灯数设置为 16,但是渲染时有 1000+ 渲染物体:渲染负担 = 1000 * 16 = 16000 次渲染计算。这显然对渲染负担非常大,导致帧数下降。
-
渲染效果:
若设置为 0,则渲染时完全依赖主灯,缺少细节和深度,渲染显得苍白。若设置为 16,则渲染出的场景灯火辉煌,更有层次,但是渲染负担也显著增加。
-
建议:
- 移动游戏:建议设置为 2~4。
- PC游戏:若你需要渲染更多灯光可以设置为 4~8。
三、使用方法(最完整且最清晰)
你可以从Inspector中设置每个渲染物体可以渲染多少附加灯:
通过 URP Asset 设置(最直观)
-
选中你的 URP Asset(比如你的项目中通常叫
UniversalRenderPipelineAsset.asset
)。 -
检查 Inspector 面板。
-
找到其中的 Lighting 类别。
-
就可以修改:
Additional Lights Per Object : 4
通过代码修改(若需要)
你也可以用代码进行设置:
csharp
using UnityEngine.Rendering.Universal;
void ChangeAdditionalLightsPerObject(int count)
{
var urp = GraphicsSettings.currentRenderPipeline as UniversalRenderPipelineAsset;
if (urp == null) return;
urp.additionalLightsPerObject = count;
Debug.Log($"每物体附加灯数设置为 {count}.");
}
比如:
csharp
ChangeAdditionalLightsPerObject(8);
四、管线对比
与 URP 相比,不同渲染管线在单物体灯光支持上存在差异:
Built-in 内置管线(前向渲染):默认每个物体有 1 个主灯方向光和若干像素灯。像素灯数量由 Quality 设置中的 Pixel Light Count 决定。
常见情况下默认是 4 个像素灯(Unity 旧版本可能默认 2 个),可以通过调高 Pixel Light Count 来让更多灯光影响物体渲染。内置管线不限制每物体灯光数量(额外灯光会拆分成多次渲染通道),但过多像素灯仍会显著拖慢渲染速度。
-
URP(通用渲染管线):在Forward 渲染路径下,URP 默认每个物体最多有"1 主灯 + 8 个附加灯"
(Additional Lights Per Object 最大可设为 8)。这意味着单个物体同时被 8 盏次要光源照亮时,会分 8 次进行光照计算。值得注意的是,在 URP 14.0+ 版本中提供了**Forward+**渲染模式,此模式取消了单物体灯光数量限制(仍受每摄像机总灯光数限制)
此外,URP 默认情况下每摄像机最多同时处理 256 个实时灯光(移动平台是 32 个)
-
HDRP(高清渲染管线):HDRP 通常使用延迟渲染(Deferred),对不透明物体几乎没有单物体灯光上限。也就是说,在 HDRP 中一个物体可以被非常多的实时点光源照亮,渲染结果层次丰富,但对 GPU 需求高。透明对象或使用前向混合渲染的物体则仍受前向渲染的灯光数限制。
小结
渲染时每物体可以渲染多少灯是 URP 渲染中非常重要且容易被忽视的数据。这一设置实际上是在渲染负担和渲染效果之间进行权衡。若设置不当:
- 渲染负担增加导致渲染帧数下降。
- 渲染效果不足时又显得"苍白""缺少细节""缺少层次感",渲染出的画面缺少深度。
通过适时调整 Additional Lights Per Object ,你可以:
- 赋予渲染足够的灯光细节。
- 同时又保证渲染负担在你所能承受的平台限制内。