3DGS之球谐函数

时间把它的愁苦和微笑留在人脸上,也留在路边一根朽木头上,时间的面目被一个乡村少年所看见,整个村庄大地是时间的容颜,一村庄人的生老病死是时间的模样。

----刘亮程《大地上的家乡》

一、球谐函数通俗解释

球谐函数(Spherical Harmonics,SH) 是一组数学工具,可以理解为“球面版的乐高积木”。它把复杂的球面形状(比如光照分布)拆解成简单的基础形状(基函数)的组合,通过调整每个基础形状的“权重系数”,就能近似还原原始形状。

  1. 基函数的本质 基函数就像不同形状的积木块。例如:

    • 零阶基函数:一个均匀的圆球(全正数区域)。
    • 一阶基函数:类似上下半球(正负各半)的形状。
    • 高阶基函数:更复杂的波瓣状结构,正负交替分布(类似花瓣或太极图)。 通过将这些基函数按比例叠加,就能模拟出复杂的光照或颜色分布。
  2. 数学上的优势

    • 正交性:每个基函数独立,无法被其他基函数组合替代。
    • 旋转不变性:旋转球面后,只需调整系数即可还原原函数,无需重新计算。
    • 压缩性:用少量系数(如9个)即可表示低频光照,比逐像素存储更高效。

二、在光照渲染中的应用

核心作用:用少量系数高效存储和计算复杂光照。 传统方法(如环境光贴图)需要逐像素存储光照数据,而SH将光照压缩成系数,实时渲染时快速还原。具体应用场景:

1. 环境光模拟
  • 问题:真实环境光来自四面八方(如天空、反射光),逐方向采样计算量大。
  • SH方案:将环境光投影到SH基函数上,存储为系数。渲染时通过系数加权求和,快速得到任意方向的光照强度。
  • 示例:天空盒的光照可压缩为9个系数(三阶SH),实时渲染时无需读取整张贴图。
2. 动态物体光照
  • 问题:移动的物体需要实时更新光照信息。
  • SH方案:在场景中预埋“光探头”(Light Probe),每个探头存储周围环境的SH系数。物体移动时,只需读取最近探头的系数,快速计算当前光照 。
3. 颜色与视角依赖效果
  • 颜色压缩:RGB颜色通过SH系数转换(如 RGB = SH系数 × C0 + 0.5),将颜色分布与方向关联,支持视角相关的渐变效果。
  • 优化存储:一个RGB颜色原本需3个通道的贴图,用SH系数可压缩到12~27个浮点数(三阶SH)。
4. 物理意义与限制
  • 低频优势:SH擅长表达低频光照(如柔和的漫反射),但无法精确还原高频细节(如锐利阴影)。
  • 计算效率:三阶SH(9个系数)是常用平衡点,高阶系数虽能提升精度,但存储和计算成本剧增。

三、现实中的类比

想象你要画一幅星空图:

  • 传统方法:逐一画出每颗星星的位置和亮度(类似逐像素存储)。
  • SH方法:用9种基础图案(如圆形、花瓣形)的叠加比例描述星空,每种图案调整明暗权重。这样只需记录9个数字,就能快速“拼”出整个星空。

这种压缩和高效还原的特性,使得SH成为游戏引擎、实时渲染技术的核心工具之一。

球谐函数介绍(Spherical Harmonics) - 知乎 这篇文章对球谐函数的介绍更加通俗易懂,推荐阅读。

具体到3DGS光栅化器中的SH -> RGB转换,是将球谐函数(Spherical Harmonics,SH)表示的抽象数学参数转换为具体的RGB颜色值的过程。这一转换是3DGS渲染中实现高效光照和颜色计算的核心步骤。3DGS中的高斯模型使用球谐函数来表示颜色,每个高斯点包含SH系数,不同阶数的系数对应不同的频率成分。低阶系数捕捉低频信息,高阶系数处理高频细节。SH系数可以通过内积计算,将方向相关的函数投影到基函数上,得到对应的系数。

四、SH与RGB的本质区别

  1. SH(球谐函数)

    • 数学表示:SH是一组基函数,用于描述球面上的复杂函数(如光照分布)。它通过分解高阶函数为低阶基函数的组合,近似表达复杂的颜色和光照信息。例如,三阶SH可以用9个系数(每通道3个)表示一个颜色分布。
    • 特性:SH具有旋转不变性,适合表达低频信号(如漫反射光),且存储效率高(仅需少量系数)。
  2. RGB

    • 直观颜色:RGB通过红、绿、蓝三原色的强度混合直接表示颜色,每个通道值范围通常为[0,1]或[0,255]。RGB是屏幕显示的基础格式,但无法直接描述复杂的光照方向性。

五、SH -> RGB转换的原理

转换的核心是通过SH系数重建颜色值,具体步骤如下:

  1. 球谐基函数加权求和 SH系数是不同阶基函数的权重。例如,零阶系数(f_dc)表示基础颜色,高阶系数(f_rest)描述方向性细节。转换时,每个方向的光照值通过以下公式计算:

  2. 归一化与范围映射

    • SH系数的数值范围通常为[-1,1],需通过线性变换映射到RGB的[0,1]范围。例如: RGB=SH系数×C0+0.5RGB=SH系数×C0​+0.5 其中,C0≈0.282C0​≈0.282是零阶球谐基函数的归一化常数,用于保持数值稳定性。
  3. 通道分离处理 每个RGB通道独立进行SH转换。例如,红色通道的SH系数单独计算,最终合并为RGB三通道颜色值。

六、具体实现

以3D高斯光栅化(3DGS)中的代码为例:

C0 = 0.28209479177387814 # 零阶SH归一化常数 
def SH2RGB(sh_coefficients): 
    return sh_coefficients * C0 + 0.5 # 将SH系数转换为RGB值
  • 作用:将SH系数从数学空间(可能含负值)映射到物理颜色空间([0,1]),确保颜色值合法。
  • 示例:若某点SH系数为[0.5, -0.3, 0.1],转换后RGB值为: (0.5×0.282+0.5, −0.3×0.282+0.5, 0.1×0.282+0.5)≈(0.641,0.415,0.528)

七、为什么需要SH -> RGB转换?

  1. 数据压缩:SH用少量系数存储复杂光照,减少内存占用(如用12个float代替纹理贴图)。
  2. 实时渲染效率:SH重建计算量远小于直接采样环境光贴图,适合移动端和游戏引擎。
  3. 视角无关性:SH系数可预计算,渲染时仅需简单运算即可得到动态光照效果。

八、实际应用场景

  1. 漫反射光照:SH模拟环境光对物体的均匀照射(如天空盒光照)。
  2. 动态物体:角色移动时,SH系数可快速更新光照效果,无需重新烘焙。
  3. 颜色优化:在3D高斯光栅化中,SH系数被优化以匹配真实场景颜色,最终通过转换输出RGB。

总结

  • SH -> RGB转换是将抽象的数学参数转化为直观颜色的桥梁,核心是基函数加权和范围映射。
  • 这一过程平衡了渲染质量与计算效率,是实时图形学中光照处理的关键技术。

欢迎关注公众号AutoSIM,新技术分享抢先一步查看

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值