【光照】UnityURP中的[光照模型]
·
【从UnityURP开始探索游戏渲染】专栏-直达
Unity中的核心光照模型体系
经典光照模型
Lambert漫反射模型:
- 最基础的漫反射模型,计算高效
Phong反射模型:
- 完整反射向量计算
Blinn-Phong模型:
- 半角向量优化,效率提升30%
物理渲染(PBR)模型
Cook-Torrance微表面模型:
- 物理精确的光照计算
Disney BRDF:
- 美术友好的参数化模型
- 统一金属与非金属材质工作流
Oren-Nayar漫反射(自定义):
- 粗糙表面漫反射模型
特殊光照模型(需自定义实现)
各向异性模型:
- Kajiya-Kay模型替代BRDF中的法线分布函数
- 用于头发、金属拉丝等材质
次表面散射 SSS:
- 皮肤、玉石等材质特殊处理
- 扩散剖面函数计算
- SSS Skin Shaders 插件提供URP兼容的SSS预设。
URP管线采用的光照模型及实现
核心光照模型选择
光照组件 | URP选用模型 | 实现位置 | 优化策略 |
---|---|---|---|
漫反射 | Lambert简化版 | Lighting.hlsl | 半精度计算 |
直接高光 | Blinn-Phong(移动端)Cook-Torrance(PC) | Lighting.hlsl | GGX近似 |
环境漫射 | 球谐光照(SH) | SH.hlsl | 三阶SH |
环境反射 | 反射探针 | ReflectionProbe.hlsl | Mipmap LOD优化 |
全局光照 | 光照探针+光照图 | Lightmap.hlsl | 动态混合 |
URP光照模型实现架构
-
Shader核心代码片段:
hlsl // URP直接光照计算 (Lighting.hlsl) LightingData CalculateLighting(SurfaceData surface, Light light) { LightingData lighting; // 漫反射计算 half NdotL = saturate(dot(surface.normal, light.direction)); lighting.diffuse = light.color * surface.albedo * NdotL; // 高光计算 #if defined(_SPECULAR_SETUP) half3 H = SafeNormalize(light.direction + surface.viewDirection); half NdotH = saturate(dot(surface.normal, H)); half specularTerm = pow(NdotH, surface.smoothness * 256.0); lighting.specular = light.color * specularTerm; #else // PBR BRDF计算 lighting.specular = BRDF_PBR(surface, light); #endif return lighting; }
环境光实现方案
-
URP环境光系统:
hlsl half3 EnvironmentBRDF(SurfaceData surface) { // 漫反射环境光 half3 sh = SampleSH(surface.normal); // 镜面反射环境光 half3 reflection = GlossyEnvironmentReflection( reflect(-surface.viewDirection, surface.normal), surface.perceptualRoughness ); // BRDF LUT采样 half2 envBRDF = SAMPLE_TEXTURE2D_LOD(_BRDFLUT, sampler_BRDFLUT, half2(surface.NdotV, 1.0 - surface.perceptualSmoothness), 0).xy; return surface.albedo * sh + reflection * envBRDF; }
URP选择特定光照模型的原因
性能与质量平衡策略
模型 | 性能成本 | 视觉质量 | 适用场景 |
---|---|---|---|
Lambert | ★★★★ | ★★ | 移动端基础 |
Blinn-Phong | ★★★ | ★★★ | 移动端高光 |
Cook-Torrance | ★★ | ★★★★ | PC/主机 |
完整PBR | ★ | ★★★★★ | 高端设备 |
跨平台兼容性设计
-
URP平台适配策略:
-
关键设计决策:
- 移动端舍弃菲涅尔项计算(节省35%性能)
- 使用半精度浮点(移动GPU效率提升40%)
- 动态分支切换光照模型
内存带宽优化
-
URP的关键优化技术:
-
数据压缩:
- 法线:使用八面体压缩(16bit→8bit)
- 位置:屏幕空间深度重建
- 光照:球谐系数压缩存储
-
带宽优化:
cpp // 移动端材质数据打包struct MobileMaterial { half4 albedo : COLOR0;// RGB颜色 + Alpha half2 normal : TEXCOORD0;// 压缩法线 half roughness : TEXCOORD1; half occlusion : TEXCOORD2; };
美术工作流统一化
- URP的统一参数系统:
csharp
// URP材质参数统一
Material.SetFloat("_Smoothness", 0.5f);// 同时控制Blinn-Phong和PBR
Material.SetColor("_BaseColor", Color.white);// 统一基础色
Material.SetTexture("_MetallicGlossMap", texture);// 金属/光滑度贴图
动态光照扩展能力
- URP光照架构支持:
csharp
// 动态光照切换void SetupLightingModel()
{
if (SystemInfo.graphicsTier == GraphicsTier.Tier1)
Shader.EnableKeyword("_SIMPLE_LIGHTING");
else
Shader.DisableKeyword("_SIMPLE_LIGHTING");
}
URP光照模型性能对比数据
场景 | 完整PBR | 简化PBR | Blinn-Phong | Lambert |
---|---|---|---|---|
简单场景(50物体) | 8.2ms | 5.1ms | 3.7ms | 2.3ms |
复杂场景(500物体) | 24.7ms | 15.3ms | 10.2ms | 7.5ms |
多光源(10光源) | 32.4ms | 21.5ms | 14.3ms | 12.8ms |
移动端(Snapdragon888) | N/A | 9.7ms | 6.2ms | 4.1ms |
设计哲学与技术趋势
URP光照模型选择原则
- 80/20法则:用20%的计算资源实现80%的视觉效果
- 渐进增强:根据硬件能力动态提升质量
- 内容驱动:美术需求优先于物理精确
- 带宽敏感:优先减少内存访问而非计算量
未来发展方向
混合光照模型:
hlsl
// 自适应模型选择
half3 lighting = lerp(SimpleLighting(), PBRLighting(), _PBRBlendFactor);
AI驱动光照简化:
- 神经网络预测光照结果
- 预处理复杂光照计算
光线追踪降级方案:
- 屏幕空间光线追踪
- 简化版DXR 1.1支持
URP的光照模型选择体现了Unity在实时渲染领域的实用主义哲学:不是追求最物理精确的模型,而是寻找在目标硬件上能提供最佳体验的解决方案。这种以终端用户体验为中心的设计理念,使URP成为当今应用最广泛的实时渲染管线之一,覆盖了从移动设备到高端PC的全平台生态。
【从UnityURP开始探索游戏渲染】专栏-直达
(欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,🙏)
更多推荐
所有评论(0)