是改善环境照明的另一种方法吗?
#1 楼
球谐函数的基本知识球谐函数是一种在球体表面上表示2D函数的方法。代替空间域(如立方体贴图),SH是在频域中定义的,具有一些有趣的属性和与照明相关的操作,可以高效执行。随着SH的“顺序”增加,可以表示功能的更高频率(细节),如下图所示($ l $是SH顺序)。通过缩放和总结以下“基本函数”,您可以表示球形上的任何2D函数,直至函数定义的频率。基本函数是用“关联的勒让德多项式”定义的,但是通常您不需要自己导出这些函数,而是可以将现有的导数用于实际球谐函数。
在SH中可以高效执行的函数称为“卷积”,这意味着将两个球形2D函数的乘积在一个球上积分。这是照明计算中的常见操作,例如其中一项功能可能是您的入射光,另一项功能是BRDF。当表示为SH时,此操作只是两个SH系数向量的点积。
另一个有趣的操作是执行有效的低通滤波的能力。因为SH是在频域中表示的,所以这仅仅是将某些SH系数缩放或归零的问题。另一方面,与空间域相比,某些其他操作可能难以在SH中执行,例如如果要旋转表示为SH的函数,则对于高阶SH来说可能会变得非常昂贵。因此,是否适合在SH中执行实际上取决于问题。
SH通常仅用于表示低频函数(即平滑变化的函数),因为更高的频率需要增加存储量(SH系数)和处理量。这就是为什么您看不到使用SH替换光泽表面上的镜面反射的原因。还有Zonal Spherical Harmonics,通过仅存储SH系数矩阵的对角线元素,可用于减少围绕z轴旋转对称的2D函数的存储和计算。如果只需要处理半球函数(在照明中也很常见),并且可以用较少的系数表示与SH相似的频率,则也可以使用半球谐波。
您还需要一种运算要执行的是“ SH投影”,将空间域数据转换为SH。您可以通过使用SH基函数对空间域数据进行卷积来执行此操作。 SH的一个有趣特性是,与空间域表示法不同,SH不会遭受锯齿,因此即使投影到非常低阶的SH也不会出现锯齿伪像。
光探头
现在您已经了解了SH的基本操作和属性,我们可以考虑如何将其应用于GI。光探针记录从每个方向到探针所处点的光量。这是球面上的2D函数,可以表示为SH(或红色,绿色和蓝色为3 SH函数)。根据我们要编码到探头中的照明细节的数量,我们可以选择SH顺序。用余弦波瓣进行卷积,可以用2SH(9个系数)表示。光探头的SH系数可以简单地生成,只需在探头的点绘制一个立方体贴图,然后将其投影到SH。
渲染几何体时,几乎不使用最接近的光探测器,并对其结果进行插值以获取空间中某个点的入射照明功能。例如,可以通过直接内插附近探针的SH系数,然后在SH域中与像素法向取向的余弦波进行卷积来实现。
#2 楼
球谐函数如果您知道什么是傅立叶变换,您几乎已经知道什么是球谐函数:它们只是一个傅立叶变换,只是基于球面而不是线性。也就是说,虽然傅立叶变换是表示函数$ f(x)$的另一种方式,但是球谐函数与极性函数$ f(\ theta,\ phi)$类似。
如果您不知道傅里叶变换是什么,那么在理解球形谐波之前,您需要先了解一下。傅立叶变换使您可以将信号表示为一系列正弦波和余弦波,每个信号的频率是前一个的两倍。也就是说,您可以将信号表示为其平均值,再加上波长与信号长度相同的正弦波,再加上两倍于该波长的正弦波,依此类推。由于傅立叶变换可以将您固定在这些特定的波长上,因此您只需要记录每个波长的幅度即可。这很有用,因为您可以丢弃一些正弦波(或降低存储其振幅的精度),而不会显着改变人眼所看到的图像。 OTOH,丢弃像素会极大地改变图像的外观。
在像图像这样的采样信号中,如果使用与原始图像中存在样本(像素)数量相同的正弦波,您可以精确地重建图像,因此一旦开始丢掉任何频率,就可以减少图像的存储。
球谐函数就像傅立叶变换一样,但是它们不是正弦波,而是使用球面函数,因此它们可以表示在球面上定义的函数(例如环境图),而不是线性函数(例如图像)。
光探测器
就像标准图像记录通过图像平面到达某个点的所有光一样,光探测器记录从各个方向到达某个点的所有光。他们首先出现电影效果。如果要将计算机生成的对象添加到现实世界场景中,则需要能够使用现实世界的照明来照明合成对象。为此,您需要知道什么光到达场景中合成对象所在的点。 (注意:虽然我说的是“照明”,但是您正在记录所有光线的图像,因此它也可以用于反射。)
因为您不能使用带有球形镜头的相机可以记录从各个方向到达一个点的所有光的镜头,您可以通过拍摄球面镜的普通照片,然后将图像重新投影到球体上来进行记录。
除了电影效果外,还可以通常使用人工场景产生的光探头。想象一下,您有一些昂贵的算法可以计算场景中的全局照明(GI),并且在该场景中还可以移动一些较小的对象(例如,其中有玩家的游戏关卡)。您不能每次都移动任何对象就运行整个GI算法,因此只能在静态场景中运行一次,并保存在关卡中各个点拍摄的光探测器。然后,您可以使用最接近的光探头来照亮播放器,从而获得与GI近似的图像。无论如何,您的全局照明中的所有边都是不对称的,因此您需要一种紧凑的表示方式,可以轻松地丢弃高频。这就是球形谐波真正擅长的!这就是为什么您会经常听到这两个术语一起使用的原因。
您可以使用昂贵的GI算法来计算光探头-通常在关卡设计工具中进行计算,或者如果要包含动态对象,则可以每秒一次(而不是每帧一次)。您可以廉价地将它们与球谐函数一起存储-16个浮点数足以用于高质量的照明,但不能反射。然后对于要照明的每个动态对象,选择最近的光照探针(或一起线性内插多个探针),并将其用作着色器的均匀或恒定输入。使用球谐函数来表示环境光遮挡数据也很常见,并且与光探头进行卷积运算非常便宜,尽管旋转球谐函数有一定的复杂性。
评论
$ \ begingroup $
好答案,这真的澄清了一切!因此,基本上,“光探测器”是一种计算移动角色上的照明的简单方法,这使我们无法重新计算整个场景的GI。另一方面,球形谐波用于滤除高频。 (如果我错了,请纠正我,我只是想看看我是否有正确的理解)。
$ \ endgroup $
– Arjan Singh
16-10-23在16:19
$ \ begingroup $
“如果使用的正弦波数量与原始图像中的样本(像素)数量相同,则可以精确地重建图像”,实际上是不正确的。例如方波需要无限多个频率才能精确表示
$ \ endgroup $
–JarkkoL
16-10-23在19:50
$ \ begingroup $
@JarkkoL当然,是真正的方波。但是,如果通过采样将其离散化,则只需要相同数量的频率即可使误差小于采样误差。这是奈奎斯特定理的方便结果(采样信号中出现的最高频率是采样率的一半)。
$ \ endgroup $
–丹·赫尔姆
16-10-23在23:06
$ \ begingroup $
是的,当然是这样。我想您需要一半的频率,但是需要复杂的(相对于真实的)频域结果。或使用DFT频率两倍的DCT和实域。
$ \ endgroup $
–JarkkoL
16-10-24在14:28
#3 楼
球谐函数假设您在数组中有一些数据,但是您想用更少的字节数表示该数据。
一种实现方法是表达您可以将数据表示为线性函数:
$ y = ax + b $
然后代替存储值数组只能存储$ a $和$ b $。
问题是,线性方程可能无法很好地近似数据。
您可以尝试二次函数:
$ y = ax ^ 2 + bx + c $
现在,您存储$ a $,$ b $和$ a $和$ b $而不是存储$ a $和$ b $ $ c $。
与线性方程相比,我们增加了内存存储,并增加了存储和检索数据的计算复杂度,但它是对数据数组的更好近似。我们也可以将其提高到三次函数或更高的三次方函数。增加阶数会增加存储,计算和准确性。
球谐函数是一种使函数定义在球面上而不是像我上面所说的$ f(x)$的方式。
就像上面的示例一样,您可以使用低阶球谐函数来制作具有较低存储量的对象,并使用较低的计算量来计算数据,但同时也会降低精度。
另一方面,您可以增加阶数并更好地近似原始数据,但代价是需要更多的存储空间,并且需要更多的计算来计算数据点。
在极端情况下,可以使用与阵列中的样本数量一样多的球谐函数,然后可以精确地重建原始阵列,但是这样做需要花费大量的计算,并且使用的存储空间也同样多刚开始的时候。
因此,实际上,如果您需要表示精细的细节(例如在球体上的锐利反射),那么球形谐波函数不会提供太多好处,但是对于没有精细细节的数据(包含没有太多的高频内容)。它们对于进行频谱分析或卷积之类的频域计算也很有用。
它们擅长存储的此类数据之一就是“辐照度”,即从其他方向射向某个点的光量。它看起来似乎有点模糊,这意味着它只有低频成分,并且是存储在球谐函数中的很好的选择。
我将把光探头的解释留给另一个人:p
评论
$ \ begingroup $
为什么要投反对票? :P
$ \ endgroup $
–艾伦·沃尔夫(Alan Wolfe)
16-10-23在15:22
$ \ begingroup $
球谐函数并不擅长表示精细的细节,这是不正确的。像傅立叶变换一样,如果保留所有频率,它们可以精确地重建原始信号。只是,如果您不需要它们,可以通过丢弃高频来简化节省空间的工作。
$ \ endgroup $
–丹·赫尔姆
16-10-23在15:32
$ \ begingroup $
抱歉,我认为在投票之后,以其他有帮助的方式拒绝对一个可疑的主张投反对票是很残酷的,但是当我重新考虑时,我的投票就被锁定了。
$ \ endgroup $
–丹·赫尔姆
16-10-23在15:33
$ \ begingroup $
啊。是的,可以用表示多项式的任何数据集的相同方式,但是实际上,对于需要与许多数据点非常契合而言,这都是不好的选择。使用多项式时,您需要一个N阶函数的N个项来精确地拟合N个数据点,这使它成为一个比数组更糟糕的选择,因为它是计算而不是查找来获取数据点。同样,实际上,对于要保留的具有高频内容的球形数据,球形谐波是一个不好的选择。在这种情况下,这不是一个好选择。
$ \ endgroup $
–艾伦·沃尔夫(Alan Wolfe)
16-10-23在15:52
$ \ begingroup $
是的,如果您希望能够重构单个样本,则是正确的,但并非傅立叶的所有用途都需要这样做-类似地,并非所有SH用途。如果要进行卷积,则在转换回样本之前在频域中进行卷积会便宜得多。完成我自己的答案后,您介意我提出修改建议以使答案更清楚吗?
$ \ endgroup $
–丹·赫尔姆
16-10-23在15:59
评论
$ \ begingroup $
使用这种方法比基于图像的照明更简单有什么好处?
$ \ endgroup $
– Arjan Singh
16-10-29在11:45
$ \ begingroup $
与使用立方体贴图相比,您可以获得质量更好的低频照明,并且具有相似的存储和性能要求。
$ \ endgroup $
–JarkkoL
16-10-29在14:36