【从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支持:
扩展性强:
Unity URP的环境光实现方案在保持实时性能的同时,通过精心设计的混合策略提供了足够高质量的全局光照效果,特别适合需要跨平台部署的项目。随着硬件发展,URP也在逐步引入更多实时全局光照技术,如Enlighten和GPU Lightmapper的集成,但核心的环境光处理架构仍保持这一基本设计理念。
<blockquote>
【从UnityURP开始探索游戏渲染】专栏-直达
(欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |