概述
如果我们有一个上半球的余弦分布函数(Do)(D_{o})(Do),并对这个余弦分布函数进行一个矩阵(M)(M)(M)变换,变换为一个新的分布函数(D)(D)(D)。
- D=MDoD = M D_{o}D=MDo
这就是基本思想:用一个余弦分布函数来拟合出不同的分布函数,并且误差很小。
LTC基本定义与性质
我们定义DoD_{o}Do为我们的基函数,也就是我们的原始分布函数。
我们在DoD_{o}Do上采样一个方向向量ωo\omega_{o}ωo,那么我们对这个方向向量做一个线性变换,也就是做一个MMM矩阵乘法变换为一个新的方向向量ω\omegaω。
- ω=Mωo∣∣Mωo∣∣\omega = \frac{M\omega_{o}}{||M\omega_{o}||}ω=∣∣Mωo∣∣Mωo,
- ωo=M−1ω∣∣M−1ω∣∣\omega_{o} = \frac{M^{-1}\omega}{||M^{-1}\omega||}ωo=∣∣M−1ω∣∣M−1ω,
那么一个目标分布函数D(ω)D(\omega)D(ω)如何变换为Do(ωo)D_{o}(\omega_{o})Do(ωo)呢?
即就是一个变量替换:
- D(ω)=Do(ωo)∂ωo∂ω=Do(M−1ω∣∣M−1ω∣∣)∣M−1∣∣∣M−1ω∣∣3D(\omega) = D_{o}(\omega_{o})\frac{\partial\omega_{o}}{\partial\omega} = D_{o}(\frac{M^{-1}\omega}{||M^{-1}\omega||})\frac{|M^{-1}|}{||M^{-1}\omega||^{3}}D(ω)=Do(ωo)∂ω∂ωo=Do(∣∣M−1ω∣∣M−1ω)∣∣M−1ω∣∣3∣M−1∣
∂ωo∂ω=∣M−1∣∣∣M−1ω∣∣3\frac{\partial\omega_{o}}{\partial\omega} = \frac{|M^{-1}|}{||M^{-1}\omega||^{3}}∂ω∂ωo=∣∣M−1ω∣∣3∣M−1∣是Jacobian项,可以从几何关系上进行推导。
那就让我们简单推导一下吧!(假如想要了解详细,请参考原文哦!)
这要从立体角开始推导啦。我们定义一个原始分布上的立体角∂ωo\partial\omega_{o}∂ωo,将其进行MMM变换,得到一个新的立体角∂ω\partial\omega∂ω。
- ∂ω=∂ωoAcosθr2\partial\omega = \partial\omega_{o}A\frac{cos\theta}{r^{2}}∂ω=∂ωoAr2cosθ
这就是一个立体角的定义。让我们来探讨一下里面的面积与距离的表达吧!
偷懒一下,可以从图中看到面积与距离的表达,那么让我们来化简一下吧。
- Mω1×Mω2=∣M∣M−T(ω1×ω2)=∣M∣M−TωoM\omega_{1}\times M\omega_{2} = |M|M^{-T}(\omega_{1} \times \omega_{2}) = |M|M^{-T}\omega_{o}Mω1×Mω2=∣M∣M−T(ω1×ω2)=∣M∣M−Tωo
- ∂ω∂ωo=∣M∣∣∣Mωo∣∣3\frac{\partial\omega}{\partial\omega_{o}} = \frac{|M|}{||M\omega_{o}||^{3}}∂ωo∂ω=∣∣Mωo∣∣3∣M∣
- ∂ωo∂ω=M−1∣∣M−1ω∣∣3\frac{\partial\omega_{o}}{\partial\omega} = \frac{M^{-1}}{||M^{-1}\omega||^{3}}∂ω∂ωo=∣∣M−1ω∣∣3M−1
如果MMM是缩放矩阵或者旋转矩阵,这个Jacobian项等于一。即分布形状是不变的。
让我们假设矩阵是缩放矩阵(M=λIM = \lambda IM=λI),
- ∣M−1=∣M∣=∣λI∣=λ3|M^{-1} = |M| = |\lambda I| = \lambda^{3}∣M−1=∣M∣=∣λI∣=λ3
- ∣∣M−1ω∣∣=∣∣λIω∣∣=λ||M^{-1}\omega|| = ||\lambda I \omega|| = \lambda∣∣M−1ω∣∣=∣∣λIω∣∣=λ
- ∂ωo∂ω=∣M−1∣∣∣M−1ω∣∣3=1\frac{\partial\omega_{o}}{\partial\omega} = \frac{|M^{-1}|}{||M^{-1}\omega||^{3}} = 1∂ω∂ωo=∣∣M−1ω∣∣3∣M−1∣=1
让我们假设矩阵是旋转矩阵M=RM = RM=R。
- ∣M∣=∣M−1∣=1|M| = |M^{-1}| = 1∣M∣=∣M−1∣=1
- ∣∣M−1ω∣∣=1||M^{-1}\omega|| = 1∣∣M−1ω∣∣=1
- ∂ωo∂ω=1\frac{\partial\omega_{o}}{\partial\omega} = 1∂ω∂ωo=1
那么被变换后的分布DDD有哪些性质呢?
首先是范数:
- ∫ΩD(ω)dω=∫ΩDo∂ωoωdω=∫ΩDo(ωo)dωo\int_{\Omega}D(\omega)\mathrm{d}\omega = \int_{\Omega}D_{o}\frac{\partial\omega_{o}}{\omega}\mathrm{d}\omega = \int_{\Omega}D_{o}(\omega_{o})\mathrm{d}\omega_{o}∫ΩD(ω)dω=∫ΩDoω∂ωodω=∫ΩDo(ωo)dωo
其次对于多边形积分相等:
- ∫PD(ω)dω=∫PoDo(ωo)dωo\int_{P}D{(\omega)}\mathrm{d}\omega = \int_{P_{o}}D_{o}(\omega_{o})\mathrm{d}\omega_{o}∫PD(ω)dω=∫PoDo(ωo)dωo
Po=M−1PP_{o} = M^{-1}PPo=M−1P
使用LTC近似BRDF
我们在对LTC有了一些基本的认识之后,让我们用它来进行拟合BRDF吧! 这里作者使用了各项同性的GGX微表面分布模型。
对于一个原分布DoD_{o}Do,我们选择一个上半球的余弦分布,当然还可以选择cosine2cosine^{2}cosine2,均匀半球分布等:
- Do(ωo=(x,y,z))=1πmax(0,z)D_{o}(\omega_{o} = (x,y,z)) = \frac{1}{\pi}max(0,z)Do(ωo=(x,y,z))=π1max(0,z)
我们来定义一下目标分布吧,也就是我们将要拟合的BRDF分布函数带着余弦项的:
- D≈ρ(ωv,ωl)cosθlD \approx \rho(\omega_{v},\omega_{l})cos\theta_{l}D≈ρ(ωv,ωl)cosθl
对于一个各项同性的材质而言,BRDF函数分布只依赖于入射方向ωv=(sinθv,0,cosθv)\omega_{v} = (sin\theta_{v},0,cos\theta_{v})ωv=(sinθv,0,cosθv)和粗糙度α\alphaα。
我们发现可以用一个矩阵MMM来很好的拟合DDD,矩阵被写为:
- M=[a0b0c0d01]M = \begin{bmatrix} a& 0 &b \\ 0& c & 0\\ d& 0 &1 \end{bmatrix}M=⎣⎡a0d0c0b01⎦⎤
可以看见这个矩阵只有四个参数需要被确定。
可以从图中看出拟合效果很不错!
使用LTC进行多边形光源的着色
我们在不同的多边形光源PPP上计算直接光照的着色,ωv\omega_{v}ωv代表视口方向(view direction),ρ\rhoρ代表BRDF函数,LLL是多边形光源出射的radiance。
- I=∫PL(ωl)ρ(ωv,ωl)cosθldωlI = \int_{P}L(\omega_{l})\rho(\omega_{v}, \omega_{l})cos\theta_{l}\mathrm{d}\omega_{l}I=∫PL(ωl)ρ(ωv,ωl)cosθldωl
我们使用LTC对BRDF函数进行拟合,可得:
- I=∫PL(ωl)ρ(ωv,ωl)cosθldωl≈∫PL(ωl)D(ωl)dωlI = \int_{P}L(\omega_{l})\rho(\omega_{v}, \omega_{l})cos\theta_{l}\mathrm{d}\omega_{l} \approx\int_{P}L(\omega_{l})D({\omega_{l})}\mathrm{d}\omega_{l}I=∫PL(ωl)ρ(ωv,ωl)cosθldωl≈∫PL(ωl)D(ωl)dωl
这里我们假设多边形光源出射的radiance是一个常数,即L(ωl)=LL(\omega_{l}) = LL(ωl)=L,那么我们可以进一步简化:
- I=∫PL(ωl)D(ωl)dωl=L∫PD(ωl)dωlI = \int_{P}L(\omega_{l})D({\omega_{l})}\mathrm{d}\omega_{l} = L\int_{P}D(\omega_{l})\mathrm{d}\omega_{l}I=∫PL(ωl)D(ωl)dωl=L∫PD(ωl)dωl
我们再进行积分变换:
- ∫PD(ω)dω=∫PoDo(ωo)dωo=E(Po)\int_{P}D(\omega)\mathrm{d}\omega = \int_{P_{o}}D_{o}(\omega_{o})\mathrm{d}\omega_{o} = E(P_{o})∫PD(ω)dω=∫PoDo(ωo)dωo=E(Po)
对于一个余弦分布的半球面函数上的多边形积分是有表达式的,即:
- E(p1,...,pn)=12π∑i=1nacos(<pi,pj>)⟨pi×pj∣∣pi×pj∣∣,[001]⟩E(p_{1},...,p_{n}) = \frac{1}{2\pi}\sum_{i=1}^{n}acos(<p_{i},p_{j}>)\left \langle \frac{p_{i}\times p_{j}}{||p_{i}\times p_{j}||}, \begin{bmatrix}0\\ 0\\1\end{bmatrix} \right \rangleE(p1,...,pn)=2π1∑i=1nacos(<pi,pj>)⟨∣∣pi×pj∣∣pi×pj,⎣⎡001⎦⎤⟩
这里的j=(i+1)mod(n)j = (i+1)mod(n)j=(i+1)mod(n),注意将多边形光源进行变换后,要将光源进行上半球面的裁剪。
这里的证明就不再赘述了。
对于带着纹理的光源来说,作者给出的方法很奇怪,就不再讨论。
总结
对于这篇paper,将一种数学方法引入了图形学,是很不错的。
优点:
- 对于简单多边形光源(矩形,三角形等)来说,对于场景的着色很快,效果很棒,误差小。
缺点:
- 复杂多边形光源(心形等)的着色速度慢,已经很难达到实时。
- 只能针对二维平面上的多边形光源。
- 只能进行直接光照着色。
实现流程:
- 通过视口方向ωv,α\omega_{v},\alphaωv,α进行采样LUT得到矩阵MMM。将面积光源进行旋转,即面积光源坐标系转变为以像素点为原点的局部坐标系。即构造一个TBN矩阵。
mul(Minv, transpose(mat3(T, B, N)));
- 将世界坐标系下的面积光源的顶点变换。
- 裁剪多边形。
- 进行线积分。
这里给出LTC的网站,想了解更详细的内容可以看看哦!
对那充满不安的日子说再见吧,对那充满不安的日子说再见吧,对那充满不安的日子说再见吧,
向着未知的梦境之地前行,向着未知的梦境之地前行,向着未知的梦境之地前行,
我想总有一日我会变得更加坚强!我想总有一日我会变得更加坚强!我想总有一日我会变得更加坚强!