球谐函数在球面域 S S S 上定义了一组标准正交基,使用参数
s = ( x , y , z ) = ( s i n θ c o s φ , s i n θ s i n φ , c o s θ ) s = (x,y,z) = (sin\theta\,cos\varphi,sin\theta\,sin\varphi,cos\theta) s = ( x , y , z ) = ( s in θ cos φ , s in θ s in φ , cos θ )
基函数定义为
Y l m ( θ , φ ) = K l m e i m φ P l ∣ m ∣ ( c o s θ ) , l ∈ N , − l ≤ m ≤ l Y_l^m(\theta,\varphi) = K_l^m\,e^{im\varphi}\,P_l^{|m|}(cos\theta), \quad l \in N, \, -l \le m \le l Y l m ( θ , φ ) = K l m e im φ P l ∣ m ∣ ( cos θ ) , l ∈ N , − l ≤ m ≤ l
其中 P l m P_l^m P l m 表示拉格朗日多项式,K l m K_l^m K l m 是归一化常数
K l m = ( 2 l + 1 ) ( l − ∣ m ∣ ) ! 4 π ( l + ∣ m ∣ ) ! K_l^m = \sqrt{\frac{(2l+1)(l-|m|)!}{4\pi(l+|m|)!}} K l m = 4 π ( l + ∣ m ∣ )! ( 2 l + 1 ) ( l − ∣ m ∣ )!
上述定义包含了虚数形式,对应的实数形式可以从以下变换得到
y l m = { 2 R e ( Y l m ) m > 0 2 I m ( Y l m ) m < 0 Y l 0 m = 0 = { 2 K l m c o s m φ P l m ( c o s θ ) m > 0 2 K l m s i n ∣ m ∣ φ P l ∣ m ∣ ( c o s θ ) m < 0 K l 0 P l 0 ( c o s θ ) m = 0 y_l^m = \left\{\begin{array}{cl} \sqrt{2}Re(Y_l^m) & m > 0 \\ \sqrt{2}Im(Y_l^m) & m < 0 \\ Y_l^0 & m = 0 \end{array} \right. = \left\{\begin{array}{cl} \sqrt{2}K_l^m\,cos\,m\varphi\,P_l^m(cos\theta) & m > 0 \\ \sqrt{2}K_l^m\,sin|m|\varphi\,P_l^{|m|}(cos\theta) & m < 0 \\ K_l^0\,P_l^0(cos\theta) & m = 0 \end{array} \right. y l m = ⎩ ⎨ ⎧ 2 R e ( Y l m ) 2 I m ( Y l m ) Y l 0 m > 0 m < 0 m = 0 = ⎩ ⎨ ⎧ 2 K l m cos m φ P l m ( cos θ ) 2 K l m s in ∣ m ∣ φ P l ∣ m ∣ ( cos θ ) K l 0 P l 0 ( cos θ ) m > 0 m < 0 m = 0
球面域 S S S 上的任意函数 f f f 可以根据以下公式进行投影
f l m = ∫ f ( s ) y l m ( s ) d s f_l^m = \int f(s)y_l^m(s)\,ds f l m = ∫ f ( s ) y l m ( s ) d s
这些系数可以被用来重构 f f f 的近似函数
f ~ ( s ) = ∑ 0 n ∑ m = − l l f l m y l m ( s ) \tilde{f}(s) = \sum_0^n\sum_{m=-l}^l f_l^my_l^m(s) f ~ ( s ) = 0 ∑ n m = − l ∑ l f l m y l m ( s )
也可以用一个索引变量来表示
f ~ ( s ) = ∑ i = 0 n 2 f i y i ( s ) \tilde{f}(s) = \sum_{i=0}^{n^2} f_i\,y_i(s) f ~ ( s ) = i = 0 ∑ n 2 f i y i ( s )
其中 i = l ( l + 1 ) + m i=l(l+1)+m i = l ( l + 1 ) + m , 例如 n = 2 n=2 n = 2 时,i = 0 , 1 , 2 , 3 i = 0, 1, 2, 3 i = 0 , 1 , 2 , 3
给定一个函数 g ( s ) = f ( Q ( s ) ) g(s) = f(Q(s)) g ( s ) = f ( Q ( s )) ( 表示函数 f ( s ) f(s) f ( s ) 通过矩阵 Q Q Q 进行旋转 ),则函数 g g g (即 f f f 旋转后)的投影等于对 f ~ \tilde{f} f ~ 进行旋转;这意味着在旋转情况下光照也是稳定的,不会产生走样或者晃动。
给定一个具有圆对称性的核函数 h ( z ) h(z) h ( z ) ,将该核函数和原函数 f f f 卷积可以产生一个新的球谐函数,可以用以下公式在频率域进行卷积操作
( h ∗ f ) l m = 4 π 2 l + 1 h l 0 f l m (h * f)_l^m = \sqrt{\frac{4\pi}{2l+1}}h_l^0f_l^m ( h ∗ f ) l m = 2 l + 1 4 π h l 0 f l m
当函数的球谐投影绕某一个轴旋转对称时被称为 Zonal Harmonics,若这一个轴是 z 轴,则函数值等于 0 的部分会形成相同维度上的线且该函数只依赖于 θ \theta θ 。此时该方向的投影在每一个 band 上只有一个非零系数。ZH 旋转比一般的 SH 更简单,给定一个函数的 ZH 系数 z l z_l z l ( SH 投影中 m = 0 部分 ),可以使用以下公式将其旋转到新的方向 d d d 上
f ( s ) = ∑ l z l 4 π 2 l + 1 ∑ z y l m ( d ) y l m ( s ) f(s) = \sum_l z_l\sqrt{\frac{4\pi}{2l+1}}\sum_z y_l^m(d)\,y_l^m(s) f ( s ) = l ∑ z l 2 l + 1 4 π z ∑ y l m ( d ) y l m ( s )
对应的 SH 系数是
f l m = 4 π 2 l + 1 z l y l m ( d ) f_l^m = \sqrt{\frac{4\pi}{2l+1}}z_l\,y_l^m(d) f l m = 2 l + 1 4 π z l y l m ( d )
使用 n t h n^{th} n t h 重构表示的两个函数 f f f 和 g g g 的乘积投影后的 k t h k^{th} k t h 系数等于
p k = ∫ y k ( s ) ( ∑ i = 0 n 2 f i y i ( s ) ) ( ∑ j = 0 n 2 g j y j ( s ) ) d s = ∑ i j Γ i j k f i g j p_k = \int y_k(s)\left(\sum_{i=0}^{n^2}f_i\,y_i(s)\right)\left(\sum_{j=0}^{n^2}g_j\,y_j(s)\right)ds = \sum_{ij}\Gamma_{ijk}f_i\,g_j p k = ∫ y k ( s ) i = 0 ∑ n 2 f i y i ( s ) j = 0 ∑ n 2 g j y j ( s ) d s = ij ∑ Γ ijk f i g j
其中
Γ i j k = ∫ y i ( s ) y j ( s ) y k ( s ) d s \Gamma_{ijk} = \int y_i(s)\,y_j(s)\,y_k(s)\,ds Γ ijk = ∫ y i ( s ) y j ( s ) y k ( s ) d s
定义
环境映射将一个球面函数记录到一个或多个纹理中,可以表达任意高频率的球面信号(通过提高纹理分辨率)以及精确捕捉任意范围的环境辐射度(通过提高每个通道的位数)
反射映射是其中最基本的一种,其假定 BRDF 是一个完美的镜面,反射方程可以简化为
L o ( v ) = F ( n , r ) L i ( r ) L_o(v) = F(n,r)L_i(r) L o ( v ) = F ( n , r ) L i ( r )
由于输入辐射度 L i L_i L i 只依赖于方向,因此可以存到一个二维表格中(即环境贴图),反射映射的算法具体步骤如下
生成环境贴图 对于每一个像素,计算物体表面该位置处的法线 根据观察方向 v v v 和法线 n n n 计算对应的反射方向 r r r 根据反射方向 r r r 计算对应环境贴图中的索引,从而得到输入辐射度 有很多投影函数可以将反射向量 r r r 映射到环境贴图中
给定归一化的反射向量 r = ( r x , r y , r z ) r=(r_x,r_y,r_z) r = ( r x , r y , r z ) ,可以计算出球面坐标 ( ρ , ϕ ) (\rho,\phi) ( ρ , ϕ ) ,ϕ ∈ [ 0 , 2 π ) \phi \in [0,2\pi) ϕ ∈ [ 0 , 2 π ) 表示经度,ρ ∈ [ 0 , π ] \rho \in [0,\pi] ρ ∈ [ 0 , π ] 表示纬度
ρ = a r c c o s ( r z ) ϕ = a t a n 2 ( r y , r x ) \begin{aligned} \rho &= arccos(r_z) \\ \phi &= atan2(r_y,r_x) \end{aligned} ρ ϕ = a rccos ( r z ) = a t an 2 ( r y , r x )
球面映射将反射向量投影到球面的二维贴图上(即球面贴图),具体计算步骤如下:
根据反射向量 r r r 和观察方向 v v v 计算出对应的球面法线 n n n , 在球面空间中 v v v 固定等于 ( 0 , 0 , 1 ) (0,0,1) ( 0 , 0 , 1 ) , 则
n = r + v ∥ r + v ∥ = ( r x m , r y m , r z + 1 m ) , m = r x 2 + r y 2 + ( r z + 1 ) 2 n = \frac{r + v}{\|r+v\|} = \left(\frac{r_x}{m}, \frac{r_y}{m}, \frac{r_z+1}{m}\right),\quad m = \sqrt{r_x^2+r_y^2+(r_z+1)^2} n = ∥ r + v ∥ r + v = ( m r x , m r y , m r z + 1 ) , m = r x 2 + r y 2 + ( r z + 1 ) 2
假设球在原点且半径等于 1, 则该法线的坐标也是球面上该点 h h h 的坐标,则 ( h x , h y ) (h_x,h_y) ( h x , h y ) 表示了球面贴图上的一点,范围是 [ − 1 , 1 ] [-1,1] [ − 1 , 1 ] ,将其映射到范围 [ 0 , 1 ] [0,1] [ 0 , 1 ] 可得
u = r x 2 m + 0.5 v = r y 2 m + 0.5 \begin{aligned} u &= \frac{r_x}{2m} + 0.5 \\ v &= \frac{r_y}{2m} + 0.5 \end{aligned} u v = 2 m r x + 0.5 = 2 m r y + 0.5
注意
球面贴图是从一个固定的方向来获取整个环境的视图,虽然也可以从新的观察方向来计算出对应的纹理坐标,然而这么做会产生视觉瑕疵,这是因为原球面贴图中的小部分在新的观察方向下被放大了。
可以直接使用反射向量 r = ( r x , r y , r z ) r=(r_x,r_y,r_z) r = ( r x , r y , r z ) 作为纹理坐标进行访问
当使用环境贴图来表示环境光时,需要使用渲染方程积分来计算光照信息,可以用蒙特卡洛估计
∫ H L i ( l ) f ( l , v ) c o s θ l d l ≈ 1 N ∑ k = 1 N L i ( l k ) f ( l k , v ) c o s θ l k p ( l k , v ) \int_H L_i(l)\,f(l,v)\,cos\theta_l\,dl \approx \frac{1}{N}\sum_{k=1}^N \frac{L_i(l_k)\,f(l_k,v)\,cos\theta_{l_k}}{p(l_k,v)} ∫ H L i ( l ) f ( l , v ) cos θ l d l ≈ N 1 k = 1 ∑ N p ( l k , v ) L i ( l k ) f ( l k , v ) cos θ l k
即使使用重要性采样,该方法仍然需要很多次采样计算,为了进一步减少计算代价,可以使用 Split Sum 近似
相关信息
一个重要的近似公式
∫ Ω f ( x ) g ( x ) d x ≈ ∫ Ω G f ( x ) d x ∫ Ω G d x ⏟ f 在积分域 Ω G 的平均值 ⋅ ∫ Ω g ( x ) d x \int_\Omega f(x)\,g(x)\,dx \approx \underbrace{\frac{\int_{\Omega_G} f(x)\,dx}{\int_{\Omega_G} dx}}_{f\,在积分域\, \Omega_G\,的平均值} \cdot \int_\Omega g(x)\,dx ∫ Ω f ( x ) g ( x ) d x ≈ f 在积分域 Ω G 的平均值 ∫ Ω G d x ∫ Ω G f ( x ) d x ⋅ ∫ Ω g ( x ) d x
在什么情况下是准确的?
积分域 Ω G \Omega_G Ω G 足够小 函数 g g g 在积分域 Ω G \Omega_G Ω G 上足够光滑(即变化波动小) BRDF 恰好满足条件!
Split Sum 近似
1 N ∑ k = 1 N L i ( l k ) f ( l k , v ) c o s θ l k p ( l k , v ) ≈ ( 1 N ∑ k = 1 N L i ( l k ) ) ( 1 N ∑ k = 1 N f ( l k , v ) c o s θ l k p ( l k , v ) ) \frac{1}{N}\sum_{k=1}^N \frac{L_i(l_k)\,f(l_k,v)\,cos\theta_{l_k}}{p(l_k,v)} \approx \left(\frac{1}{N}\sum_{k=1}^N L_i(l_k)\right)\,\left(\frac{1}{N}\sum_{k=1}^N \frac{f(l_k,v)\,cos\theta_{l_k}}{p(l_k,v)}\right) N 1 k = 1 ∑ N p ( l k , v ) L i ( l k ) f ( l k , v ) cos θ l k ≈ ( N 1 k = 1 ∑ N L i ( l k ) ) ( N 1 k = 1 ∑ N p ( l k , v ) f ( l k , v ) cos θ l k )
如果 BRDF 是 glossy 的,此时满足条件积分域 Ω G \Omega_G Ω G 足够小,则有
∫ H L i ( l ) f ( l , v ) c o s θ l d l ≈ ∫ H L i ( l ) d l d l ⏟ 对环境贴图作 p r e f i l t e r ∫ H f ( l , v ) c o s θ l d l ⏟ 预计算 L U T \int_H L_i(l)\,f(l,v)\,cos\theta_l\,dl \approx \underbrace{\frac{\int_{H}L_i(l)\,dl}{dl}}_{对环境贴图作\, prefilter} \underbrace{\int_H f(l,v)\,cos\theta_l\,dl}_{预计算 \,LUT} ∫ H L i ( l ) f ( l , v ) cos θ l d l ≈ 对环境贴图作 p re f i lt er d l ∫ H L i ( l ) d l 预计算 LU T ∫ H f ( l , v ) cos θ l d l
∫ H f ( l , v ) c o s θ l d l = F 0 ∫ H f ( l , v ) F ( v , h ) ( 1 − ( 1 − v ⋅ h ) 5 ) c o s θ l d l + ∫ H f ( l , v ) F ( v , h ) ( 1 − v ⋅ h ) 5 c o s θ l d l ≈ F 0 ( 1 N ∑ k = 1 N D ( h k ) ⋅ G ( l k , v ) ⋅ ( 1 − ( 1 − v ⋅ h ) 5 ) ∣ n ⋅ l ∣ 4 ∣ n ⋅ l ∣ ∣ n ⋅ v ∣ p ( l k , v ) ) + 1 N ∑ k = 1 N D ( h k ) ⋅ G ( l k , v ) ⋅ ( 1 − v ⋅ h ) 5 ∣ n ⋅ l ∣ 4 ∣ n ⋅ l ∣ ∣ n ⋅ v ∣ p ( l k , v ) \begin{aligned} \int_H f(l,v)\,cos\theta_l\,dl &= F_0\int_H\frac{f(l,v)}{F(v,h)}\Big(1 - (1 - v\cdot h)^5\Big)\,cos\theta_l\,dl + \int_H \frac{f(l,v)}{F(v,h)}(1-v\cdot h)^5\,cos\theta_l\,dl \\ & \approx F_0\,\Big(\frac{1}{N}\sum_{k=1}^N \frac{D(h_k)\cdot G(l_k,v)\cdot (1 - (1 - v\cdot h)^5)\,|n\cdot l|}{4|n\cdot l||n\cdot v|\,p(l_k,v)}\Big) + \frac{1}{N}\sum_{k=1}^N \frac{D(h_k)\cdot G(l_k,v)\cdot (1 - v\cdot h)^5\,|n\cdot l|}{4|n\cdot l||n\cdot v|\,p(l_k,v)} \end{aligned} ∫ H f ( l , v ) cos θ l d l = F 0 ∫ H F ( v , h ) f ( l , v ) ( 1 − ( 1 − v ⋅ h ) 5 ) cos θ l d l + ∫ H F ( v , h ) f ( l , v ) ( 1 − v ⋅ h ) 5 cos θ l d l ≈ F 0 ( N 1 k = 1 ∑ N 4∣ n ⋅ l ∣∣ n ⋅ v ∣ p ( l k , v ) D ( h k ) ⋅ G ( l k , v ) ⋅ ( 1 − ( 1 − v ⋅ h ) 5 ) ∣ n ⋅ l ∣ ) + N 1 k = 1 ∑ N 4∣ n ⋅ l ∣∣ n ⋅ v ∣ p ( l k , v ) D ( h k ) ⋅ G ( l k , v ) ⋅ ( 1 − v ⋅ h ) 5 ∣ n ⋅ l ∣
在 Real Shading in Unreal Engine 4 中,使用 GGX 重要性采样来进行蒙特卡洛估计,并且使用 n ⋅ l n\cdot l n ⋅ l 做加权平均,即
∫ H L i ( l ) d l d l ≈ 1 ∑ k = 1 N ∣ n ⋅ l k ∣ ∑ k = 1 N L i ( l k ) ∣ n ⋅ l k ∣ \frac{\int_H L_i(l)\,dl}{dl} \approx \frac{1}{\sum_{k=1}^N |n\cdot l_k|} \sum_{k=1}^N L_i(l_k)\,|n\cdot l_k| d l ∫ H L i ( l ) d l ≈ ∑ k = 1 N ∣ n ⋅ l k ∣ 1 k = 1 ∑ N L i ( l k ) ∣ n ⋅ l k ∣
警告
由于 GGX 采样分布依赖于观察方向,而此处默认使用 n = v = r n = v = r n = v = r 的观察方向来进行采样,因此导致在 grazing angle 处得到的反射不够充分
同样使用重要性采样 D ( h ) ∣ n ⋅ h ∣ D(h)|n\cdot h| D ( h ) ∣ n ⋅ h ∣ ,这是因为
∫ Ω D ( h ) ∣ n ⋅ h ∣ d h = 1 \int_\Omega D(h)|n\cdot h|\,dh = 1 ∫ Ω D ( h ) ∣ n ⋅ h ∣ d h = 1
又我们要对 l l l 进行采样而不是 h h h ,因此需要使用 Jacobian 变换
J ( h ) = 1 4 ∣ v ⋅ h ∣ J(h) = \frac{1}{4|v\cdot h|} J ( h ) = 4∣ v ⋅ h ∣ 1
可得
p d f ( l k , v ) = D ( h ) ∣ n ⋅ h ∣ 4 ∣ v ⋅ h ∣ pdf(l_k,v) = \frac{D(h)|n\cdot h|}{4|v\cdot h|} p df ( l k , v ) = 4∣ v ⋅ h ∣ D ( h ) ∣ n ⋅ h ∣
综上
提示
∫ H f ( l , v ) c o s θ l d l ≈ F 0 ( 1 N ∑ k = 1 N G ( l k , v ) ⋅ ∣ v ⋅ h ∣ ⋅ ( 1 − ( 1 − v ⋅ h ) 5 ) ∣ n ⋅ h ∣ ∣ n ⋅ v ∣ ) + 1 N ∑ k = 1 N G ( l k , v ) ⋅ ∣ v ⋅ h ∣ ⋅ ( 1 − v ⋅ h ) 5 ∣ n ⋅ h ∣ ∣ n ⋅ v ∣ \int_H f(l,v)\,cos\theta_l\,dl \approx F_0\,\Big(\frac{1}{N}\sum_{k=1}^N \frac{G(l_k,v)\cdot|v\cdot h|\cdot (1 - (1 - v\cdot h)^5)}{|n\cdot h||n\cdot v|}\Big) + \frac{1}{N}\sum_{k=1}^N\frac{G(l_k,v)\cdot|v\cdot h|\cdot(1-v\cdot h)^5}{|n\cdot h||n\cdot v|} ∫ H f ( l , v ) cos θ l d l ≈ F 0 ( N 1 k = 1 ∑ N ∣ n ⋅ h ∣∣ n ⋅ v ∣ G ( l k , v ) ⋅ ∣ v ⋅ h ∣ ⋅ ( 1 − ( 1 − v ⋅ h ) 5 ) ) + N 1 k = 1 ∑ N ∣ n ⋅ h ∣∣ n ⋅ v ∣ G ( l k , v ) ⋅ ∣ v ⋅ h ∣ ⋅ ( 1 − v ⋅ h ) 5
L o ( p , ω o ) = k d c π ∫ Ω L i ( p , ω i ) ∣ n ⋅ ω i ∣ d ω i L o ( p , ϕ o , θ o ) = k d c π ∫ ϕ = 0 2 π ∫ θ = 0 1 2 π L i ( p , ϕ i , θ i ) c o s θ s i n θ d ϕ d θ \begin{aligned} L_o(p,\omega_o) &= k_d\frac{c}{\pi}\int_{\Omega} L_i(p,\omega_i)\,|n\cdot \omega_i|\,d\omega_i \\ L_o(p,\phi_o,\theta_o) &= k_d\frac{c}{\pi}\int_{\phi=0}^{2\pi}\int_{\theta=0}^{\frac{1}{2}\pi} L_i(p,\phi_i,\theta_i)\,cos\theta\,sin\theta\,d\phi\,d\theta \end{aligned} L o ( p , ω o ) L o ( p , ϕ o , θ o ) = k d π c ∫ Ω L i ( p , ω i ) ∣ n ⋅ ω i ∣ d ω i = k d π c ∫ ϕ = 0 2 π ∫ θ = 0 2 1 π L i ( p , ϕ i , θ i ) cos θ s in θ d ϕ d θ
使用黎曼和近似估计,将 ϕ \phi ϕ 划分成 n 1 n_1 n 1 份,将 θ \theta θ 划分成 n 2 n_2 n 2 份,则
L o ( p , ϕ o , θ o ) ≈ k d c π ∑ ϕ = 0 n 1 ∑ θ = 0 n 2 2 π n 1 1 2 π n 2 L i ( p , ϕ i , θ i ) c o s θ s i n θ = k d c π n 1 n 2 ∑ ϕ = 0 n 1 ∑ θ = 0 n 2 L i ( p , ϕ i , θ i ) c o s θ s i n θ \begin{aligned} L_o(p,\phi_o,\theta_o) &\approx k_d\frac{c}{\pi} \sum_{\phi=0}^{n_1}\sum_{\theta=0}^{n_2} \frac{2\pi}{n_1}\frac{\frac{1}{2}\pi}{n_2} L_i(p,\phi_i,\theta_i)\,cos\theta\,sin\theta \\ &= k_d\frac{c\pi}{n_1n_2} \sum_{\phi=0}^{n_1}\sum_{\theta=0}^{n_2} L_i(p,\phi_i,\theta_i)\,cos\theta\,sin\theta \end{aligned} L o ( p , ϕ o , θ o ) ≈ k d π c ϕ = 0 ∑ n 1 θ = 0 ∑ n 2 n 1 2 π n 2 2 1 π L i ( p , ϕ i , θ i ) cos θ s in θ = k d n 1 n 2 c π ϕ = 0 ∑ n 1 θ = 0 ∑ n 2 L i ( p , ϕ i , θ i ) cos θ s in θ
球谐系数 Y l m Y_{lm} Y l m 中的前 9 个可以预先计算得到,具体如下
( x , y , z ) = ( s i n θ c o s ϕ , s i n θ s i n ϕ , c o s θ ) Y 00 ( θ , ϕ ) = 0.282095 ( Y 11 ; Y 10 ; Y 1 − 1 ) ( θ , ϕ ) = 0.488603 ( x ; z ; y ) ( Y 21 ; Y 2 − 1 ; Y 2 − 2 ) ( θ , ϕ ) = 1.092548 ( x z ; y z ; x y ) Y 20 ( θ , ϕ ) = 0.315392 ( 3 z 2 − 1 ) Y 22 ( θ , ϕ ) = 0.546274 ( x 2 − y 2 ) \begin{aligned} (x,y,z) \quad &= \quad (sin\theta\,cos\phi,sin\theta\,sin\phi,cos\theta) \\ Y_{00}(\theta,\phi) \quad &= \quad 0.282095 \\ (Y_{11};Y_{10};Y_{1-1})(\theta,\phi) \quad &= \quad 0.488603(x;z;y) \\ (Y_{21};Y_{2-1};Y_{2-2})(\theta,\phi) \quad &= \quad 1.092548(xz;yz;xy) \\ Y_{20}(\theta,\phi) \quad &= \quad 0.315392(3z^2-1) \\ Y_{22}(\theta,\phi) \quad &= \quad 0.546274(x^2-y^2) \end{aligned} ( x , y , z ) Y 00 ( θ , ϕ ) ( Y 11 ; Y 10 ; Y 1 − 1 ) ( θ , ϕ ) ( Y 21 ; Y 2 − 1 ; Y 2 − 2 ) ( θ , ϕ ) Y 20 ( θ , ϕ ) Y 22 ( θ , ϕ ) = ( s in θ cos ϕ , s in θ s in ϕ , cos θ ) = 0.282095 = 0.488603 ( x ; z ; y ) = 1.092548 ( x z ; yz ; x y ) = 0.315392 ( 3 z 2 − 1 ) = 0.546274 ( x 2 − y 2 )
又
E ( n ) = ∫ Ω ( n ) L ( ω ) ( n ⋅ ω ) d ω E(n) = \int_{\Omega(n)} L(\omega)\,(n\cdot \omega)\,d\omega E ( n ) = ∫ Ω ( n ) L ( ω ) ( n ⋅ ω ) d ω
其中 E E E 和 L L L 可以通过球谐函数系数来表示
L ( θ , ϕ ) = ∑ l , m L l m Y l m ( θ , ϕ ) E ( θ , ϕ ) = ∑ l , m E l m Y l m ( θ , ϕ ) \begin{aligned} L(\theta,\phi) &= \sum_{l,m} L_{lm}Y_{lm}(\theta,\phi) \\ E(\theta,\phi) &= \sum_{l,m} E_{lm}Y_{lm}(\theta,\phi) \end{aligned} L ( θ , ϕ ) E ( θ , ϕ ) = l , m ∑ L l m Y l m ( θ , ϕ ) = l , m ∑ E l m Y l m ( θ , ϕ )
我们定义 A = ( n ⋅ ω ) A=(n\cdot\omega) A = ( n ⋅ ω ) ,由于 A A A 没有方位角 ϕ \phi ϕ 依赖,m = 0 m=0 m = 0 因此我们可以只使用 l l l 索引
A ( θ ) = m a x [ c o s θ , 0 ] = ∑ l A l Y l 0 ( θ ) A(\theta) = max[cos\theta,0] = \sum_l A_lY_{l0}(\theta) A ( θ ) = ma x [ cos θ , 0 ] = l ∑ A l Y l 0 ( θ )
可以证明
E l m = 4 π 2 l + 1 A l L l m E_{lm} = \sqrt{\frac{4\pi}{2l+1}} A_lL_{lm} E l m = 2 l + 1 4 π A l L l m
为了方便,我们定义一个新的变量
A l ^ = 4 π 2 l + 1 A l \hat{A_l} = \sqrt{\frac{4\pi}{2l+1}}A_l A l ^ = 2 l + 1 4 π A l
综上
提示
E ( θ , ϕ ) = ∑ l , m A l ^ L l m Y l m ( θ , ϕ ) E(\theta,\phi) = \sum_{l,m} \hat{A_l} L_{lm}Y_{lm}(\theta,\phi) E ( θ , ϕ ) = l , m ∑ A l ^ L l m Y l m ( θ , ϕ )
相关信息
l = 1 A l ^ = 2 π 3 l > 1 , o d d A l ^ = 0 l , e v e n A l ^ = 2 π ( − 1 ) l 2 − 1 ( l + 2 ) ( l − 1 ) [ l ! 2 l ( l 2 ! ) 2 ] \begin{aligned} l = 1 \quad & \hat{A_l} = \frac{2\pi}{3} \\ l > 1,odd \quad & \hat{A_l} = 0 \\ l,even \quad & \hat{A_l} = 2\pi\frac{(-1)^{\frac{l}{2}-1}}{(l+2)(l-1)}\Big[\frac{l!}{2^l(\frac{l}{2}!)^2}\Big] \end{aligned} l = 1 l > 1 , o dd l , e v e n A l ^ = 3 2 π A l ^ = 0 A l ^ = 2 π ( l + 2 ) ( l − 1 ) ( − 1 ) 2 l − 1 [ 2 l ( 2 l ! ) 2 l ! ]
可以计算出前几项
A 0 ^ = 3.141593 A 1 ^ = 2.094395 A 2 ^ = 0.785398 A 3 ^ = 0 A 4 ^ = − 0.130900 A 5 ^ = 0 A 6 ^ = 0.049087 \hat{A_0} = 3.141593 \quad \hat{A_1} = 2.094395 \quad \hat{A_2} = 0.785398 \\ \hat{A_3} = 0 \quad \hat{A_4} = -0.130900 \quad \hat{A_5} = 0 \quad \hat{A_6} = 0.049087 A 0 ^ = 3.141593 A 1 ^ = 2.094395 A 2 ^ = 0.785398 A 3 ^ = 0 A 4 ^ = − 0.130900 A 5 ^ = 0 A 6 ^ = 0.049087
可以看到 A l ^ \hat{A_l} A l ^ 衰减的非常快,对于近似估计我们只需要考虑低频的光照系数(l ≤ 2 l \le 2 l ≤ 2 )。同样的,Irradiance 只需要 9 个参数就可以得到很好的近似估计,即
l = 0 m = 0 l = 1 − 1 ≤ m ≤ 1 l = 2 − 2 ≤ m ≤ 2 \begin{aligned} l = 0 \quad & m = 0 \\ l = 1 \quad & -1 \le m \le 1 \\ l = 2 \quad & -2 \le m \le 2 \end{aligned} l = 0 l = 1 l = 2 m = 0 − 1 ≤ m ≤ 1 − 2 ≤ m ≤ 2
Prefiltering
给定任意环境贴图,我们需要计算出前 9 个光照系数 L l m , l ≤ 2 L_{lm}, \; l\le 2 L l m , l ≤ 2
L l m = ∫ θ = 0 π 2 ∫ ϕ = 0 2 π L ( θ , ϕ ) Y l m ( θ , ϕ ) s i n θ d θ d ϕ L_{lm} = \int_{\theta=0}^{\frac{\pi}{2}}\int_{\phi=0}^{2\pi}L(\theta,\phi)Y_{lm}(\theta,\phi)\,sin\theta\,d\theta\,d\phi L l m = ∫ θ = 0 2 π ∫ ϕ = 0 2 π L ( θ , ϕ ) Y l m ( θ , ϕ ) s in θ d θ d ϕ
Rendering
得到光照系数 L l m L_{lm} L l m 后,可以使用如下公式计算 Irradiance
E ( n ) = n t M n E(n) = n^t M n E ( n ) = n t M n
M = ( c 1 L 22 c 1 L 2 − 2 c 1 L 21 c 2 L 11 c 1 L 2 − 2 − c 1 L 22 c 1 L 2 − 1 c 2 L 1 − 1 c 1 L 21 c 1 L 2 − 1 c 3 L 20 c 2 L 10 c 2 L 11 c 2 L 1 − 1 c 2 L 10 c 4 L 00 − c 5 L 20 ) M = \begin{pmatrix} c_1L_{22} & c_1L_{2-2} & c_1L_{21} & c_2L_{11} \\ c_1L_{2-2} & -c_1L_{22} & c_1L_{2-1} & c_2L_{1-1} \\ c_1L_{21} & c_1L_{2-1} & c_3L_{20} & c_2L_{10} \\ c_2L_{11} & c_2L_{1-1} & c_2L_{10} & c_4L_{00}-c_5L_{20} \end{pmatrix} M = c 1 L 22 c 1 L 2 − 2 c 1 L 21 c 2 L 11 c 1 L 2 − 2 − c 1 L 22 c 1 L 2 − 1 c 2 L 1 − 1 c 1 L 21 c 1 L 2 − 1 c 3 L 20 c 2 L 10 c 2 L 11 c 2 L 1 − 1 c 2 L 10 c 4 L 00 − c 5 L 20
c 1 = 0.429043 c 2 = 0.511664 c 3 = 0.743125 c 4 = 0.886227 c 5 = 0.247708 c_1 = 0.429043 \quad c_2 = 0.511664 \\ c_3 = 0.743125 \quad c_4 = 0.886227 \quad c_5 = 0.247708 c 1 = 0.429043 c 2 = 0.511664 c 3 = 0.743125 c 4 = 0.886227 c 5 = 0.247708
对于未优化矩阵操作的系统,也可以使用如下公式计算
E ( n ) = c 1 L 22 ( x 2 − y 2 ) + c 3 L 20 z 2 + c 4 L 00 − c 5 L 20 + 2 c 1 ( L 2 − 2 x y + L 21 x z + L 2 − 1 y z ) + 2 c 2 ( L 11 x + L 1 − 1 y + L 10 z ) \begin{aligned} E(n) &= c_1L_{22}(x^2 - y^2) + c_3L_{20}z^2 + c_4L_{00} - c_5L_{20} \\ &+ 2c_1(L_{2-2}xy + L_{21}xz + L_{2-1}yz) \\ &+ 2c_2(L_{11}x + L_{1-1}y + L_{10} z) \end{aligned} E ( n ) = c 1 L 22 ( x 2 − y 2 ) + c 3 L 20 z 2 + c 4 L 00 − c 5 L 20 + 2 c 1 ( L 2 − 2 x y + L 21 x z + L 2 − 1 yz ) + 2 c 2 ( L 11 x + L 1 − 1 y + L 10 z )
参考 Real Shading in Unreal Engine 4 Image Based Lighting with Multiple Scattering Diffuse Irradiance