【光照】Unity[PBR]环境光中的[漫反射]

news/2025/10/11 13:54:12/文章来源:https://www.cnblogs.com/SmalBox/p/19134888

【从UnityURP开始探索游戏渲染】专栏-直达

漫反射辐照的核心作用

漫反射辐照(Diffuse Irradiance)在URP PBR中用于模拟环境光对物体表面的均匀散射效果,通过预计算环境立方体贴图的低频光照信息,为动态物体提供间接漫反射光照。其核心公式为:

$L_d=\frac{c}{\pi}\int_\Omega L_i(\omega_i)(n\cdot\omega_i)d\omega_i$

其中c为反照率,$L_i$为环境光强度。

其核心是将环境立方体贴图卷积为球谐系数(SH)或光照探针数据。计算过程遵循Lambertian反射模型.

技术演进关键节点

  • Unity 5.x时代

    首次引入标准PBR管线,但依赖内置渲染管线,环境光计算需全分辨率立方体贴图,内存消耗大。

  • URP 7.x 2020

    采用三层球谐基函数压缩环境光数据,内存占用降低90%以上,同时支持动态光照探针混合,实现移动端高效运行。

  • URP 2022

    引入HDR环境贴图支持,提升高动态范围场景下漫反射辐照的精度,通过RGBM编码解决LDR贴图亮度失真问题。

解决的问题与方案优势

传统问题

  • 动态物体无法复用静态光照贴图,导致场景光照不连贯。
  • 实时积分计算环境光性能开销过高,尤其在移动端。

URP方案选择原因

  • 球谐函数压缩‌:用9个系数(三层SH)近似环境光分布,相比立方体贴图减少90%内存占用。

    球谐系数(SH)卷积计算原理

    • 环境立方体贴图到球谐系数的转换过程分为两步:
      • 首先对立方体贴图进行蒙特卡洛积分,计算各阶球谐基函数的投影系数;
      • 然后在运行时通过法线向量重建光照。
    • 核心公式为:

    $c_{l,m}=\int_\Omega L_i(\omega)Y_{l,m}(\omega)d\omega$

    其中$Y_{l,m}$为球谐基函数,$L_i$为环境光强度。Unity采用三阶SH(9个系数),仅需存储RGB三个通道的9个浮点数,相比立方体贴图内存占用减少99.8%。

    具体实现步骤

    • 预计算阶段

      对立方体贴图的每个纹素进行半球积分,计算0-2阶球谐系数:

      hlsl
      // 伪代码:立方体贴图投影到SH
      for each texel in cubemap {float3 dir = normalize(texelDirection);float3 color = SampleCubemap(texel);for (int l=0; l<=2; ++l) {for (int m=-l; m<=l; ++m) {SHCoeff[l][m] += color * SHBasis(l,m,dir) * solidAngle;}}
      }
      

      实际工程中会使用重要性采样优化计算量。

    • 运行时重建

      在Shader中通过法线向量与预计算系数的点积快速重建光照:

      hlsl
      // URP中的SH重建代码(简化版)
      float3 SampleSH(float3 normalWS) {float4 vB = normalWS.xyzz * normalWS.yzzx;float3 x1 = float3(dot(unity_SHAr, normalWS),dot(unity_SHAg, normalWS),dot(unity_SHAb, normalWS));float3 x2 = float3(dot(unity_SHBr, vB),dot(unity_SHBg, vB),dot(unity_SHBb, vB));return x1 + x2 + unity_SHC.rgb;
      }
      

      此代码对应三阶SH重建公式:

      $L(n)=\sum_{l=0}{2}\sum_{m=−l}c_{l,m}Y_{l,m}(n)$

    该技术解决了动态物体无法实时计算全局光照的问题,通过球谐函数(SH)或光照探针存储预计算数据,显著降低实时渲染开销。

  • 探针混合‌:动态物体通过插值邻近探针数据实现平滑过渡,避免光照突变。

    光照探针数据生成

    • 探针烘焙

      每个光照探针位置会生成球谐系数,通过射线追踪计算周围几何体的间接光照。Unity使用伴随勒让德多项式作为基函数,存储7个half4变量(unity_SHAr至unity_SHC)。

    • 动态物体采样

      动态物体通过插值邻近探针的SH系数实现光照混合:

      hlsl
      // 探针混合伪代码
      float3 GetProbeIrradiance(float3 position) {Probe probes = FindNearbyProbes(position);float3 sh = lerp(probes[0].SH, probes[1].SH, weight);return SampleSH(sh, normalWS);
      }
      

      该方案解决了动态物体与环境光的一致性问题

  • 硬件优化‌:SH计算使用GPU并行,在Shader中通过SampleSH函数直接采样,避免实时积分。

技术对比优势

方案 内存占用 计算开销 适用场景
立方体贴图 6MB+ 静态环境反射
球谐光照(SH) 108字节 极低 动态物体漫反射
光照探针 可变 复杂动态场景

SH方案通过基函数投影实现高频信息剔除,特别适合Lambertian漫反射的低频特性。Unity选择该方案因其在移动端可实现0.5ms内的环境光重建,且支持动态更新.

具体实现示例

在URP Shader中,漫反射辐照通过以下HLSL代码实现:

hlsl
// 球谐采样
float3 irradiance = SampleSH(normalWS);
// 结合材质反照率
float3 diffuse = albedo * irradiance;

此过程将预计算的球谐系数与表面法线点乘,重建环境光照。例如,金属材质通过调整反照率c控制能量守恒,非金属材质则保留更多散射光。

镜面IBL的协同作用

镜面IBL(Specular IBL)通过分裂求和近似(Split Sum Approximation)处理高光反射,与漫反射辐照共同构成完整的PBR环境光照模型。预滤波环境贴图(粗糙度分级)和BRDF LUT分别处理光线散射与菲涅尔效应,公式为:

$L_s=\int_\Omega f_r(\omega_i,\omega_o)L_i(\omega_i)(n\cdot \omega_i)d\omega_i$

其中fr为BRDF函数。Unity选择此方案因其在移动端仅需两次纹理采样即可实现物理精确的高光反射,平衡性能与效果


【从UnityURP开始探索游戏渲染】专栏-直达
(欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,🙏)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/934759.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年六角钢厂家最新推荐榜:品质过硬与性价比之选

2025年六角钢厂家最新推荐榜:品质过硬与性价比之选随着工业和建筑行业的快速发展,六角钢作为重要的结构材料,其需求量逐年增加。选择一家优质的六角钢供应商不仅能够确保产品质量,还能在成本控制和售后服务方面获得…

2025广东粉末供应厂家TOP10榜单:品质卓越与服务一流的

2025广东粉末供应厂家TOP10榜单:品质卓越与服务一流的随着工业技术的不断进步,粉末材料在各个领域的应用越来越广泛。特别是在广东地区,粉末材料供应商的竞争日益激烈。为了帮助筛选广东粉末品牌,特此发布权威推荐…

2025热喷铝厂家最新推荐榜:品质卓越与专业服务的行业首选!

2025热喷铝厂家最新推荐榜:品质卓越与专业服务的行业首选!随着工业技术的不断进步,热喷铝技术在防腐、耐磨等领域的应用越来越广泛。选择一家优质的热喷铝厂家对于保障工程质量和延长设备使用寿命至关重要。本文将为…

2025方钢厂家,异型钢厂家,六角钢厂家最新推荐榜:品质与性价比兼备的首选品牌!

在现代工业中,方钢作为重要的基础材料,广泛应用于建筑、机械制造、桥梁建设等多个领域。选择优质的方钢供应商对于确保项目质量和成本控制至关重要。为了帮助筛选方钢品牌,特此发布权威推荐榜单,为采购决策提供专业…

JS单线程设计的目的

JavaScript是浏览器的脚本语言。其最终操作都会提现到渲染线程中,也就是浏览器页面显示。如果设计成多线程的话,势必会在dom操作时出现竞争问题,这会导致渲染显示出现难以预期的问题。挣钱养家

强化学习 动作空间(离散/连续)

1. 离散动作空间的策略网络 在离散空间中,动作是可数的,例如:{左, 右, 上, 下} 或 {加速, 刹车}。 网络架构与处理方式输出层:Softmax策略网络的最后一层是一个 Softmax 层。假设有 N 个可选动作,网络会输出一…

QuickLook软件!一款鼠标单击PDF即能显示内容的软件!

软件介绍 大家都知道,苹果电脑有个非常实用的功能,那就是只要单击文件,然后按空格就可以预览文件里的内容,但是Windows没有这功能。今天介绍的这款叫QuickLook,它能在Windows的环境下实现快速预览文件的功能。软件…

Http Security Headers

HTTP 安全相关的响应头(Security Headers)是 Web 应用安全防护的核心手段,通过浏览器与服务器的协作,防御跨站脚本(XSS)、点击劫持、中间人攻击、信息泄露等常见风险。以下是最常用的安全头及其作用机制、使用方…

参照Yalla、Hawa等主流APP核心功能,开发一款受欢迎的海外语聊需要从哪些方面入手

近期,从海外客户的主要咨询需求来看,主要是围绕在借鉴主流APP,在此基础上需要开发属于他们Agency、Coinseller、CP、PK等特色功能。每个客户的需求都有差异,建议您从自己的运营方向出发,来开发符合自己需求的海外…

本土化DevOps的突围之路:Gitee如何重塑企业研发效能

本土化DevOps的突围之路:Gitee如何重塑企业研发效能 在数字经济加速发展的今天,DevOps已从技术概念升级为企业数字化转型的核心引擎。国际权威调研机构Gartner预测,到2025年全球DevOps市场规模将突破300亿美元,其中…

【STM32计划开源】基于STM32的智能点滴输液系统

【STM32计划开源】基于STM32的智能点滴输液系统pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &…

溶气气浮/浅层气浮/国内知名气浮机靠谱厂家品牌推荐

溶气气浮/浅层气浮/国内知名气浮机靠谱厂家品牌推荐 无锡工源环境科技股份有限公司是一家在环保水处理设备领域,特别是气浮设备研发与制造方面,具有深厚技术积累和市场声誉的高新技术企业。公司始终专注于水处理技术…

iOS 26 崩溃日志深度指南,如何收集、符号化、定位与监控 - 实践

iOS 26 崩溃日志深度指南,如何收集、符号化、定位与监控 - 实践2025-10-11 13:35 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !imp…

鸿蒙Next密码自动填充服务:安全与便捷的完美融合 - 实践

鸿蒙Next密码自动填充服务:安全与便捷的完美融合 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas…

覆盖动画 / 工业 / 科研!Rhino 7:专业 3D 建模的全能解决方案,新手也能上手

在 3D 建模领域,一款功能强大、兼容广泛且高效稳定的工具,往往能成为设计师、工程师突破创作瓶颈的关键。由美国 Robert McNeel 公司打造的Rhinoceros(简称 Rhino) 系列软件,凭借其 “集百家之长” 的设计理念,早…

2020CSP-J2比赛记录题解

题目请看洛谷备注:这次比赛我是没打的T1 先把数转成二进制,逐位计算,并判断是否可完整正确拆分贴一下代码 #include <bits/stdc++.h> using namespace std; #define fre(c) freopen(c".in","r…

Binder.getCallingPid()和Binder.getCallingUid()漏洞分析

最近在学习安卓漏挖,在分析ghera数据集时发现一个很有意思的binder特性,但还没搞懂底层原理,先挖个坑 漏洞分析EnforceCallingOrSelfPermission-PrivilegeEscalation-Lean以下代码使用Binder.getCallingPid()和Bind…

详细介绍:golang基础语法(五)切片

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

让博客园设置支持PlantUml画图

1. 引入 2. 博客园不支持plantuml渲染 3. 编写js脚本支持plantuml 4. 缺点‍ 1. 引入众所周知,我们在写博客的时候,常使用PlantUML 和 Mermaid绘制图表、流程图、架构图。这是因为用代码去画图,不怎么需要手动控制格…

jj

jjimport numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns from sklearn.preprocessing import StandardScaler from sklearn.decomposition import PCA from sklearn.cluste…