时间:2025-09-24 17:25
人气:
作者:admin
【从UnityURP开始探索游戏渲染】专栏-直达
$Cambient$
Unity URP应用:
早期移动设备的基础方案
在URP中作为最低质量级别选项
实现示例:
hlsl
half3 ambient = unity_AmbientSky * _AmbientScale;
实现原理:
特点:
Unity URP选用方案:
URP默认环境光方案
从Light Probe或Lightmap采样
实现核心:
hlsl
half3 ambient = SampleSH(normalWS);
Unity URP实现:
内置SSAO后处理效果
通过_MainLightOcclusionProbes控制
实现示例:
hlsl
half ao = SampleAmbientOcclusion(positionCS);
ambient *= ao;
实现原理:
预先生成立方体贴图(Cubemap)
根据表面粗糙度进行模糊采样
公式:
$镜面环境光 = textureLod(cubemap, R, roughness * MAX_MIP_LEVEL)$
Unity URP应用:
hlsl
half3 reflection = GlossyEnvironmentReflection(
reflect(-viewDir, normalWS),
perceptualRoughness,
ao
);
graph TD
A[环境光源] --> B{质量等级}
B -->|Low| C[恒定环境光]
B -->|Medium| D[球谐光照+AO]
B -->|High| E[反射探针+SH]
C --> F[光照合成]
D --> F
E --> F
F --> G[最终颜色]
hlsl
// URP环境光处理 (Lighting.hlsl)
half3 MixEnvironmentLighting(
half3 diffuse,
half3 specular,
half3 normalWS,
half3 viewDirWS,
half roughness,
half occlusion)
{
// 漫反射环境光
half3 sh = SampleSH(normalWS) * occlusion;
// 镜面反射环境光
half3 reflection = GlossyEnvironmentReflection(
reflect(-viewDirWS, normalWS),
roughness,
occlusion
);
return diffuse * sh + specular * reflection;
}
| 模型 | 内存占用 | 计算成本 | 视觉保真度 |
|---|---|---|---|
| 恒定环境光 | 12B | 1周期 | 30% |
| 球谐光照 | 36B | 15周期 | 65% |
| 反射探针 | 2-10MB | 50周期 | 90% |
| URP混合方案 | 动态调整 | 20-80周期 | 75-95% |
hlsl
// 简化环境光计算
half3 ambient = unity_AmbientSky * occlusion;
csharp
// 使用混合探针
reflectionProbe.blendDistance = 10.0f;
reflectionProbe.mode = ReflectionProbeMode.Blended;
hlsl
// 增强AO效果
ambient *= pow(occlusion, _AOPower);
Unity URP的环境光系统通过分层架构实现了跨平台的高效渲染,在保持物理合理性的同时,针对不同硬件能力提供最优解决方案。这种灵活的设计使开发者能够在各种项目规模中取得理想的视觉效果与性能平衡。
【从UnityURP开始探索游戏渲染】专栏-直达
(欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,????)