envmap.pdf |辐射环境图的有效表示形式
球谐函数及其在实时图形中的应用

我正在使用球谐函数将反射(像镜子)立方体贴图转换为散射光立方体贴图。 >
根据我对图像的了解,我计算出9个系数(红色,绿色,蓝色)来描述立方体贴图的颜色。

这9个系数就是...
/>


当您可视化它们时,它们就会变成...



然后我用这些系数来做一些事情获取立方体贴图的颜色。

我不了解的部分是使用图像获取这9个系数。所有论文都假定您以某种方式计算出了该系数,因为它很容易。

我不知道该如何进行计算。


更新

所以当我看着球形谐波照明| Simon的技术博客

我发现了这个方程式...


所以现在我知道方程式中神秘的黄色部分与“立体角相关”。我知道怎么做立体角,但是我还是不知道怎么做。

#1 楼

因此,一开始,您就可以从多维数据集映射中获取样本。每个样本都有颜色和法线(dir),您可以在其中采样该颜色。
这就是我的方法。我使用本文的coeffs(与您链接的相同),其中前9个具有值。

为每个样本构造一个值:


使用样本中的法线计算SH基础

float Y00     = 0.282095;
float Y11     = 0.488603 * normal.x;
float Y10     = 0.488603 * normal.z;
float Y1_1    = 0.488603 * normal.y;
float Y21     = 1.092548 * normal.x*normal.z;
float Y2_1    = 1.092548 * normal.y*normal.z;
float Y2_2    = 1.092548 * normal.y*normal.x;
float Y20     = 0.946176 * normal.z * normal.z - 0.315392;
float Y22     = 0.546274 * (normal.x*normal.x - normal.y*normal.y);



然后将这些系数乘以您的颜色(L)

vec3 L00   = L * Y00;
vec3 L11   = L * Y11;
vec3 L10   = L * Y10;
vec3 L1_1  = L * Y1_1;
vec3 L21   = L * Y21;
vec3 L2_1  = L * Y2_1;
vec3 L2_2  = L * Y2_2;
vec3 L20   = L * Y20;
vec3 L22   = L * Y22;


就这样,你有了自己的系数。现在,您可以将它们存储在某些数据结构中。您可以像这样累积它们:

someArray[0] += L00;
someArray[1] += L11;
etc...


,然后将这些累积的系数除以多个样本;

然后在重建时:


再计算场景基准点的SH基准一次。
为了逼近场景给定点的散射辐照度,
使用余弦波瓣进行卷积
卷积意味着对于每个SH阶,乘以$
\ hat {A} = [\ pi,\ frac {2} {3} \ pi,\ frac {\ pi } {4}] $

$ \ hat {A_0} = 3.141593 $,
$ \ hat {A_1} = 2.094395 $,
$ \ hat {A_2} = 0.785398 $


L coeffs是从数据结构中采样的。

vec3 color = A0*Y00*L00  
             + A1*Y1_1*L1_1 + A1*Y10*L10 + A1*Y11*L11 
             + A2*Y2_2*L2_2 + A2*Y2_1*L2_1 + A2*Y20*L20 + A2*Y21*L21 + A2*Y22*L22;


免责声明:这对我来说基本上有效,但是我不是专家,某些东西可能会丢失或不完美,因为这是令人困惑的主题...

评论


$ \ begingroup $
嗨。感谢您的详细说明。理解这篇论文很有帮助。但是,我想知道您是如何到达“ SH的余弦波”的?如果是这样,我将无法找到该部分。
$ \ endgroup $
–蓝色错误
17年4月17日在21:37

$ \ begingroup $
@BlueBug在漫射照明中,朗伯模型射线在一个方向上以许多角度而不是镜面反射。因此,为了近似于此并评估给定点处的辐照度,在余弦波瓣上进行卷积-这意味着在SH的情况下,对于每个SH阶除以1,2,3-[pi,(2/3) * pi,pi / 4]。希望对您有所帮助,请同时检查
$ \ endgroup $
–narthex
17-4-17在22:49



$ \ begingroup $
对不起,我的意思不是占卜而是乘法。
$ \ endgroup $
–narthex
17年4月18日在0:06

$ \ begingroup $
阅读完您的答案后,我编辑了问题,并向您介绍了一些说明。我不明白您为什么不执行方程式的绿色部分。您已经在做,但是我看不到您在做什么?还是制作SH地图的方法不止一种?
$ \ endgroup $
–蓝色错误
17年4月18日在0:59

$ \ begingroup $
与其平均加权每个立方体贴图样本,不如通过每个像素的立体角加权。否则,您将使角落的权重过大而使面部中心的权重不足。
$ \ endgroup $
–内森·里德(Nathan Reed)
17年4月18日在20:04

#2 楼

首先,我假设您有一个(x,y,z)点列表,每个点都具有ar,g,b颜色,它们是您想要用球谐函数近似的样本。

要获得您使矩阵nx 9 $ A $的系数,其中每一行都是序列$ y_0(x,y,z),y_1 ^ {-1}(x,y,z),y_1 ^ {0}(x,y ,z),y_1 ^ {1}(x,y,z),y_2 ^ {-2}(x,y,z),y_2 ^ {-1}(x,y,z),y_2 ^ {0} (x,y,z),y_2 ^ {1}(x,y,z),y_2 ^ {2}(x,y,z)$以及每个轴对应的3个矩阵$ b $

然后取一个未知系数的9x3矩阵$ x $(每种颜色为9)。那么$ Ax = b $是要求解的方程。该方程将被过度确定,因此您需要近似求解。

这意味着进行线性回归以找到给出最小误差的系数。在线性代数中有很好的描述。

评论


$ \ begingroup $
我知道每种颜色都需要一个矩阵(9个数字)。因此,我需要一个红色矩阵,一个绿色矩阵和一个蓝色矩阵。但是,您告诉我这9个数字必须是y0,y-11,y01,y11,y-22,y-12,y02,y12,y22,但我不知道如何计算这些矩阵值。我不明白“ nx3矩阵b当时的颜色”是什么意思?这里的“ n”是什么?您是指RGB值吗?
$ \ endgroup $
–蓝色错误
17-4-15的2:26



$ \ begingroup $
您不需要进行线性回归。由于SH形成正交基,因此每个SH的系数将等于立方图与SH的内积:(cubemap * SH)的球面积分。换句话说,求立方图中所有像素的总和(像素颜色* SH以该像素的方向向量评估的像素*像素的立体角)。
$ \ endgroup $
–内森·里德(Nathan Reed)
17年4月15日在5:45



$ \ begingroup $
用未知系数的9x3矩阵x(每种颜色9个)表示什么?有三排吗?每行都是相同的数字,代表红色,绿色或蓝色吗?然后我的工作就是将矩阵A乘以x以获得3x3 b的矩阵吗?
$ \ endgroup $
–蓝色错误
17年4月17日在22:10