我从这里了解了关于球谐函数的信息,其中介绍了SH用于生成辐照环境贴图的用途,以及它如何使EM生成过程比常规操作更快。他们说的是:

”如果我们想从边长为64 texels的输入立方体贴图生成边长仅为32 texels的漫射立方体贴图,则成本约为32x32x6x64x64x6 1.51亿次操作,使用这种蛮力算法无法实时生成辐照环境贴图
示例中,球谐函数方法的运行时复杂度仅为9 x 64 x 64 x 6,每千次操作函数“

我的问题是:


如何从64个像素生成具有32个像素的边长的立方体贴图的成本如何计算为32x32x6x64x64x6为什么不32x32x6 + 64 * 64 * 6?为何生成SH的成本为9x64x64x6?
蛮力算法找到从一个节点到另一个节点的最短路径。此算法如何用于生成多维数据集映射?


#1 楼

1
对于所生成的漫反射立方体贴图的每个纹理像素(其面值为$ 6 $乘以$ 32 \乘以32 $纹素),该漫射方程将环境地图的所有纹理元素组合在一起(其面值为$ 6 $乘以$ 64 \乘以64 $ texels)。因此,$ 32 \ times 32 \ times 6 \ times 64 \ times 64 \ times 6 $如上所述。
由于本文考虑SH具有$ 9 $的系数,并且每个系数需要组合环境图的所有纹理像素,因此为$ 9 \ times 64 \ times 64 \ times 6 $。
2
“ Bruteforce”不一定是指图论。在本文中,它指的是幼稚的方法,即遍历扩散贴图的每个单个纹理元素,并且每次结合环境贴图的每个单个纹理元素。 。
作为输入,我们有一个环境图:它是由六个纹理组成的一组,形成一个立方体,代表来自各个方向的光。假定光线来自足够远的光源,就我们而言,就好像它们无限远。环境图通常看起来像是GPU Gems文章中该图的左图:

作为输出,对于我们要渲染的给定对象的任何点,我们想知道漫反射会影响它。这意味着什么?光线的方向和观察者的方向。
对于不透明的材料,通常考虑导致该颜色的两个分量:漫反射和镜面反射。漫射是由于光线稍微穿透了表面,被部分吸收,然后沿随机方向射出。镜面反射是由于光从表面反射而没有进入而引起的。

回到问题
因此,我们想知道对象的点的颜色,我们知道要计算该点,我们需要对各个方向的光进行积分,并且我们有一个表示来自各个方向的光的立方体贴图。到目前为止,一切都很好。
一个问题基本上是集成,这意味着我们需要遍历半球的每个纹理元素(所以一半的环境图:$(64 x 64 x 6)/ 2 texels),做一些数学运算,然后将其添加到结果中。每个点都要进行大量计算,如果可能的话,我们希望避免。
我们知道,一个光的贡献取决于光的方向。如果我们认为环境是静态的(照明不会改变),则可以将仅依赖于光照和表面法线(而不依赖于材质或观察者)的计算部分隔离出来,对其进行预先计算并存储以备后用。对于漫射项,这就是前面提到的漫射辐照度,它通常看起来像插图的中心图。每个像素代表给定表面法线的辐照度项。正确的图是镜面环境贴图,以类似的方式计算,但积分不同。
查找32x32x6x64x64x6
由于结果看起来非常模糊,因此存储可能不需要是$ 64 \乘以64 $,文章假设$ 32 \乘以32 $。但是,通过整合整个相应的半球,分别计算出32×32×6纹素的颜色。那部分从未消失:我们只是将其从渲染阶段移到了预计算阶段。
因此仍然是$(32 x 32 x 6)x(64 x 64 x 6)/ 2 $。那是文章中提到的数字的一半。我想作者要么是假设模型是整个球体的积分,要么是为了清楚起见只掉了0.5美元。环境图真的很模糊:当然,肯定有一种方法可以使用少于$ 32 \乘以32 \乘以6 $的术语来存储其信息,并希望减少工作量。球形谐波就是通过将辐照度压缩为几个系数来完成的。
我对数学并不熟悉,无法进行解释,但足以说一般认为对于散射,三阶SH是足够。阶数3的SH涉及9个系数,对于每个系数我们都需要在整个半球上进行积分。
因此,要获取和处理的是$(9 \ times 64 \ times 64 \ times 6)/ 2 $ 。这里也缺少2美元的因素。

评论


$ \ begingroup $
感谢您的指导。为了生成具有32x32x6的立方体贴图,我们只使用64x64x6中的32x32x6像素(我的意思是只计算32x32x6像素),那么为什么还要再次将32x32x6乘以64x64x6? (我认为如果我理解了为什么扩散方程结合了环境图的所有纹理元素,并且我也无法理解扩散方程与立方体图的关系,我的问题将会得到回答)。由于我自己学习过计算机图形学,因此当我面对更大的问题时会出现一些愚蠢的问题。抱歉:D
$ \ endgroup $
–乔
16-09-26在8:56