单Pass多光源技术在一个Shader Pass中循环处理所有光源,减少Draw Call但增加Shader复杂度,适合PC/主机等高性能平台处理少量光源。多Pass单光源技术每个Pass处理单一光源,Shader简单但Draw Call多,适合移动端等兼容性要求高的场景。Unity等引擎常混合使用这两种方式。选择时需权衡目标平台硬件资源、光源数量和场景复杂度,或考虑延迟渲染等替代方案。核心矛盾在于Draw Call与Shader压力的平衡,不同场景需针对性优化。
1. 原理对比
单Pass多光源(Single Pass Multiple Lights)
在一个Shader Pass中,循环遍历所有影响该像素的光源,累加光照结果。
典型做法:在Fragment Shader里for循环处理N个光源。
多Pass单光源(Multiple Passes, One Light per Pass)
每个Pass只处理一个光源,最终结果通过混合(Blending)叠加。
典型做法:主光源在第一个Pass,其他光源每个单独一个Additive Pass。
2. 优缺点对比
| 方式 | 优点 | 缺点 |
|---|---|---|
| 单Pass多光源 | 只需一次几何处理(Draw Call少),减少带宽消耗;适合光源数量较少且硬件资源充足的场景 | Shader复杂度随光源数线性增长,寄存器/常量/指令数压力大,易超硬件上限,移动端易崩溃或掉帧;分支和循环效率低下 |
| 多Pass单光源 | Shader简单,寄存器和常量压力小,兼容性好,易于维护和扩展 | 每个光源都要重新处理几何(Draw Call多),带宽和填充率消耗大,光源多时性能急剧下降,易受Overdraw影响 |
3. 适用场景
单Pass多光源:适合光源数量有限(如4个以内),且目标平台硬件资源较强(如PC/主机),或对Draw Call极度敏感的场景。
多Pass单光源:适合光源数量不多、对兼容性和稳定性要求高的移动端,或Shader复杂度受限的平台。
4. 细节补充
Unity等引擎的“前向渲染”默认主光源单独Pass,其他光源用Additive Pass(多Pass单光源),移动端通常只支持4个逐像素光源。
单Pass多光源在移动端常因寄存器/常量溢出导致Shader编译失败或运行崩溃。
多Pass单光源在光源多、场景复杂时,Draw Call和Overdraw会成为瓶颈。
5. 总结
单Pass多光源:减少Draw Call,Shader压力大,易受硬件资源限制。
多Pass单光源:Shader简单,Draw Call多,易受带宽和Overdraw影响。
实际项目中,常根据目标平台和场景复杂度权衡选择,或采用延迟渲染等更高效的多光源处理方案。
版权声明:本文为CSDN博主「你一身傲骨怎能输」的原创文章,
遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_33060405/article/details/145067857





