常士 发表于 2025-10-6 13:15:46

【光照】[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]
查看完整版本: 【光照】[PBR][环境光]实现方法解析