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;
免责声明:这对我来说基本上有效,但是我不是专家,某些东西可能会丢失或不完美,因为这是令人困惑的主题...
#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
评论
$ \ 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