找回密码
 立即注册
首页 业界区 业界 【光照】[PBR][环境光]实现方法解析

【光照】[PBR][环境光]实现方法解析

常士 4 天前
【从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的环境光实现方案

核心方案:反射探针 + 球谐光照

实现代码‌:
  1. hlsl
  2. // 环境光漫反射计算
  3. half3 ambientDiffuse = SampleSH(normalWS) * surfaceData.albedo;
  4. // 环境光镜面反射计算
  5. half3 reflectVector = reflect(-viewDirectionWS, normalWS);
  6. half3 ambientSpecular = GlossyEnvironmentReflection(
  7.     reflectVector,
  8.     positionWS,
  9.     surfaceData.roughness,
  10.     1.0
  11. );
  12. // 最终环境光
  13. half3 ambient = ambientDiffuse * (1 - surfaceData.metallic) +
  14.                ambientSpecular * surfaceData.metallic;
复制代码
选择原因‌:


  • 性能与质量平衡‌:

    • 球谐光照提供高效的漫反射环境光
    • 反射探针处理高质量的镜面反射

  • 动态场景支持‌:

    • 反射探针可实时更新
    • 球谐系数可动态计算

  • 移动端优化‌:
    1. hlsl
    2. // 移动端简化版
    3. half3 ambient = SampleSH(normalWS) * surfaceData.albedo;
    4. half3 specular = surfaceData.metallic * SAMPLE_TEXTURECUBE_LOD(
    5.     _GlossyEnvironmentCube,
    6.     sampler_GlossyEnvironmentCube,
    7.     reflectVector,
    8.     surfaceData.roughness * UNITY_SPECCUBE_LOD_STEPS
    9. );
    复制代码
  • 艺术家友好‌:

    • 直观的反射探针放置
    • 自动生成的球谐光照

关键实现细节


  • 反射探针系统‌:

    • 立方体贴图预过滤
    • 多级mipmap存储不同粗糙度的反射
    • 混合探针权重计算

  • 球谐光照计算‌:

    • 使用3阶球谐(9个系数)
    • 场景光照烘焙为球谐系数
    • 实时动态物体也能接收球谐光照

  • 环境光遮蔽集成‌:
    1. hlsl
    2. ambient *= lerp(1.0, occlusion, _AmbientOcclusionParam.w);
    复制代码
  • 性能分级处理‌:
    1. hlsl
    2. #if defined(_ENVIRONMENTREFLECTIONS_OFF)
    3.     half3 ambientSpecular = 0;
    4. #else
    5.     // 完整反射计算
    6. #endif
    复制代码
各模型性能对比

模型内存占用GPU消耗动态支持视觉质量球谐光照极低极低★★★★★★★☆☆☆反射探针中-高中★★★☆☆★★★★☆SSR低高★★★★☆★★★★☆URP混合方案中中★★★★☆★★★★☆Unity URP的选择优势

分级渲染支持‌:


  • 高端设备:完整反射探针+球谐
  • 移动设备:简化版球谐光照
场景适应性‌:


  • 室内场景:高密度反射探针
  • 开放世界:球谐为主+关键区域探针
动态GI支持‌:


  • 可与光照探针系统配合
  • 支持实时环境光更新
扩展性强‌:


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

相关推荐

您需要登录后才可以回帖 登录 | 立即注册