看到有人问PRT的问题但没人回答,加上自己今天卧病在床,顺便练打字
注:1.有些英文不知如何翻译。
2.我只讲个大概(要详细讲的话,百页纸肯定少不了)
1. 首先spherical harmonics是什么呢?
它们其实就是由Legendre Polynomials(勒让德多项式)表示的一种正交Basis Function。我们可以通过缩放和组合(scale & combine)Basis Functions来模拟令一种函数。但是在模拟之前我们必须先project原函数到Basis Function,这样我们就可以得到其coefficients(系数),之后我们可以用其系数和那个Basis Function来近似的还原那个原函数。我们可以将正交Basis Functions想像成正交向量(1,0)和(0,1),系数就是(x,0)和(0,y), 假设原矢量是(x,y)。系数(x,0) = (x,y) * (1,0), (0,y)=(x,y)*(0,1)。然后还原(x,y) = (x,0)*(1,0) + (0,y)*(0,1)
而对于正交Basis Functions,它们有一种特性:通过对一个原函数的系数与另一个原函数的点乘我们可以实现对那两个原函数的积分!这就是我们利用它作为光照模拟的最重要原因之一。(注:只适用于正交Basis Functions!) 另一个原因是其定义域是在球形范围内。(我们经典的渲染公式就是以其为定义域的啦)
ps. 其实spherical harmonics更多地应用于量子力学以及Computational Chemistry(计算化学)中。
2. 之后到底如何用它们来模拟光照呢?
我们知道当要用渲染公式来模拟光照时,有一个棘手的问题,那就是积分。但通过spherical harmonics,我们就可以将积分简化成加法和乘法,也就是几个点积啦!(到底几个取决于spherical harmonics的order数)
所以我们需要两个系数,一个是brdf()×cos()×V()函数的系数,另一个是L()也就是光照函数的系数。在预渲染阶段时,我们将那些函数project得到系数,在渲染时就可以用几个快速的点积就行了。(这就是其为什么那么快的原因。)
ps. 在算brdf()×cos()×V()时要用到Monte Carlo RayTracing/Integration。(V()是visibility function(可见信函数))
ps. 一般来说在用SH模拟光照时,我们只用perfect diffuse的brdf,它的brdf非常简单,就是albedo(color)/PI。
3. 然后到底如何用它们来模拟动态光呢?
还有一个原因我们用SH来模拟光照就是它们rotationally invariant(旋转不变性)。同过这一性质,单光源旋转时,我们就只需旋转其系数就行了,而无需旋转L()。如果它们没有这种性质,每一次光源旋转,我们都要重新project L()一次,而projection是很化时间的。
Ivanic/Ruedenberg SH rotation和Choi. SH rotation是两种比较普遍的旋转方法。(我不知DX用的是什么)
ps. 需要注意的是旋转SH系数非常非常难编(简直是恶梦!)(夸张了点 )
to be continued
注:1.有些英文不知如何翻译。
2.我只讲个大概(要详细讲的话,百页纸肯定少不了)
1. 首先spherical harmonics是什么呢?
它们其实就是由Legendre Polynomials(勒让德多项式)表示的一种正交Basis Function。我们可以通过缩放和组合(scale & combine)Basis Functions来模拟令一种函数。但是在模拟之前我们必须先project原函数到Basis Function,这样我们就可以得到其coefficients(系数),之后我们可以用其系数和那个Basis Function来近似的还原那个原函数。我们可以将正交Basis Functions想像成正交向量(1,0)和(0,1),系数就是(x,0)和(0,y), 假设原矢量是(x,y)。系数(x,0) = (x,y) * (1,0), (0,y)=(x,y)*(0,1)。然后还原(x,y) = (x,0)*(1,0) + (0,y)*(0,1)
而对于正交Basis Functions,它们有一种特性:通过对一个原函数的系数与另一个原函数的点乘我们可以实现对那两个原函数的积分!这就是我们利用它作为光照模拟的最重要原因之一。(注:只适用于正交Basis Functions!) 另一个原因是其定义域是在球形范围内。(我们经典的渲染公式就是以其为定义域的啦)
ps. 其实spherical harmonics更多地应用于量子力学以及Computational Chemistry(计算化学)中。
2. 之后到底如何用它们来模拟光照呢?
我们知道当要用渲染公式来模拟光照时,有一个棘手的问题,那就是积分。但通过spherical harmonics,我们就可以将积分简化成加法和乘法,也就是几个点积啦!(到底几个取决于spherical harmonics的order数)
所以我们需要两个系数,一个是brdf()×cos()×V()函数的系数,另一个是L()也就是光照函数的系数。在预渲染阶段时,我们将那些函数project得到系数,在渲染时就可以用几个快速的点积就行了。(这就是其为什么那么快的原因。)
ps. 在算brdf()×cos()×V()时要用到Monte Carlo RayTracing/Integration。(V()是visibility function(可见信函数))
ps. 一般来说在用SH模拟光照时,我们只用perfect diffuse的brdf,它的brdf非常简单,就是albedo(color)/PI。
3. 然后到底如何用它们来模拟动态光呢?
还有一个原因我们用SH来模拟光照就是它们rotationally invariant(旋转不变性)。同过这一性质,单光源旋转时,我们就只需旋转其系数就行了,而无需旋转L()。如果它们没有这种性质,每一次光源旋转,我们都要重新project L()一次,而projection是很化时间的。
Ivanic/Ruedenberg SH rotation和Choi. SH rotation是两种比较普遍的旋转方法。(我不知DX用的是什么)
ps. 需要注意的是旋转SH系数非常非常难编(简直是恶梦!)(夸张了点 )
to be continued