【从UnityURP开始探索游戏渲染】专栏-直达
环境光实现流程
环境光在基于物理的渲染(PBR)中主要通过以下流程实现:
- 环境贴图采样:获取周围环境的辐照度
- 漫反射计算:处理非金属材质的漫反射部分
- 镜面反射计算:处理金属和高光的反射部分
- 环境光遮蔽:考虑几何遮蔽和环境遮挡
- 最终混合:将环境光与其他光照成分结合
主要环境光实现模型
1. 球谐光照(Spherical Harmonics)
原理:
- 将环境光信息编码为球谐系数
- 使用低阶多项式近似环境光照
公式:
L(θ,ϕ)≈\\sum_{l=0}^n\\sum_{m=−l}^lc_l^mY_l^m(θ,ϕ)
特点:
- 内存占用小
- 计算效率高
- 适合动态场景
2. 预计算辐照度贴图(Precomputed Radiance Transfer)
原理:
- 预计算环境光对场景的影响
- 存储为立方体贴图或2D贴图
实现方式:
- 漫反射:预卷积的辐照度图
- 镜面反射:预过滤的反射探针
3. 屏幕空间反射(Screen Space Reflection)
原理:
- 直接在屏幕空间追踪光线
- 实时计算环境反射
特点:
- 无需预计算
- 消耗较大GPU资源
- 只能反射屏幕内可见内容
Unity URP的环境光实现方案
核心方案:反射探针 + 球谐光照
实现代码:
c
hlsl
// 环境光漫反射计算
half3 ambientDiffuse = SampleSH(normalWS) * surfaceData.albedo;
// 环境光镜面反射计算
half3 reflectVector = reflect(-viewDirectionWS, normalWS);
half3 ambientSpecular = GlossyEnvironmentReflection(
reflectVector,
positionWS,
surfaceData.roughness,
1.0
);
// 最终环境光
half3 ambient = ambientDiffuse * (1 - surfaceData.metallic) +
ambientSpecular * surfaceData.metallic;
选择原因:
-
性能与质量平衡:
- 球谐光照提供高效的漫反射环境光
- 反射探针处理高质量的镜面反射
-
动态场景支持:
- 反射探针可实时更新
- 球谐系数可动态计算
-
移动端优化:
chlsl // 移动端简化版 half3 ambient = SampleSH(normalWS) * surfaceData.albedo; half3 specular = surfaceData.metallic * SAMPLE_TEXTURECUBE_LOD( _GlossyEnvironmentCube, sampler_GlossyEnvironmentCube, reflectVector, surfaceData.roughness * UNITY_SPECCUBE_LOD_STEPS );
-
艺术家友好:
- 直观的反射探针放置
- 自动生成的球谐光照
关键实现细节
-
反射探针系统:
- 立方体贴图预过滤
- 多级mipmap存储不同粗糙度的反射
- 混合探针权重计算
-
球谐光照计算:
- 使用3阶球谐(9个系数)
- 场景光照烘焙为球谐系数
- 实时动态物体也能接收球谐光照
-
环境光遮蔽集成:
chlsl ambient *= lerp(1.0, occlusion, _AmbientOcclusionParam.w);
-
性能分级处理:
chlsl #if defined(_ENVIRONMENTREFLECTIONS_OFF) half3 ambientSpecular = 0; #else // 完整反射计算 #endif
各模型性能对比
模型 | 内存占用 | GPU消耗 | 动态支持 | 视觉质量 |
---|---|---|---|---|
球谐光照 | 极低 | 极低 | ★★★★★ | ★★☆☆☆ |
反射探针 | 中-高 | 中 | ★★★☆☆ | ★★★★☆ |
SSR | 低 | 高 | ★★★★☆ | ★★★★☆ |
URP混合方案 | 中 | 中 | ★★★★☆ | ★★★★☆ |
Unity URP的选择优势
分级渲染支持:
- 高端设备:完整反射探针+球谐
- 移动设备:简化版球谐光照
场景适应性:
- 室内场景:高密度反射探针
- 开放世界:球谐为主+关键区域探针
动态GI支持:
- 可与光照探针系统配合
- 支持实时环境光更新
扩展性强:
- 容易集成SSR等后期效果
- 支持自定义环境光遮蔽
Unity URP的环境光实现方案在保持实时性能的同时,通过精心设计的混合策略提供了足够高质量的全局光照效果,特别适合需要跨平台部署的项目。随着硬件发展,URP也在逐步引入更多实时全局光照技术,如Enlighten和GPU Lightmapper的集成,但核心的环境光处理架构仍保持这一基本设计理念。
【从UnityURP开始探索游戏渲染】专栏-直达
(欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,🙏)