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