球谐函数在球面域 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