Real-Time Polygonal-Light Shading with Linearly

Real-Time Polygonal-Light Shading with Linearly Transformed Cosine

概述

这篇论文使用一个线性变换(Linearly Transformed Coines)将原本的BSDF分布转换到clamped consine上,利用这种近似方法可以求出一个区域光(Area Light)近似的解析解。

定义

要被变换的原始分布

原始的分布被记为DoD_o。它的选择控制了变换之后的分布的基本形状。

线性变换

为了生成一个新的分布DD,可以将一个线性变换MM应用到方向角ωo\omega_o上。这个转换过程其实不一定是线性的:ω=Mωo/Mωo\omega=M\omega_o/\|M\omega_o\|,同时逆变换为ωo=M1ω/M1ω\omega_o=M^{-1}\omega/\|M^{-1}\omega\|

近似形状的表达式

ω\omega处的LTSD的大小等于原始的分布DoD_oωo\omega_o处的大小乘上立体角大小之比,公式(1):

D(ω)=Do(ωo)ωoω=Do(M1ωM1ω)M1M1ω3 D(\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}

其中ωoω=M1M1ω3\frac{\partial\omega_o}{\partial\omega}=\frac{|M^{-1}|}{\|M^{-1}\omega\|^3}

形状不变

在一种线性变换——缩放(M=λIM=\lambda I)下,因为缩放不影响方向角ω\omega的方向,所以不会改变分布。

特性

正规化

变换后分布DD继承了原始分布的一些属性DoD_o。LSTDDD的范数和原始分布DoD_o是一致的,因此通过公示(1)可以得到,公式(2): ΩD(ω)dω=ΩDo(ωo)ωoωdω=ΩDo(ωo)dωo \int_{\Omega}D(\omega)\mathrm{d}\omega=\int_{\Omega}D_o(\omega_o)\frac{\partial\omega_o}{\partial\omega}\mathrm{d}\omega=\int_{\Omega}D_o(\omega_o)\mathrm{d}\omega_o

在多边形上的积分

在LTSDDD分布在多边形PP区域上的积分就等于原始分布DoD_o在多边形Po=M1PP_o=M^{-1}P上的积分。因此可以得到公式(3): PD(ω)dω=PoDo(ωo)dωo \int_{P}D(\omega)\mathrm{d}\omega=\int_{P_o}D_o(\omega_o)\mathrm{d}\omega_o

用LTC近似基于物理的BRDFs

使用clamped cosine分布作为原始分布可以产生一族线性变换之后的分布,可以很好地近似BRDFs。

Linearly Tranformed Cosines

对于半球面上的clamped cosine分布可以这样表示,公式(4): Do(ωo=(x,y,z))=1πmax(0,z) D_o(\omega_o=(x,y,z))=\frac{1}{\pi}\max(0,z)

拟合(Fitting)

本文的近似目标是GGX 微表面 BRDF。精确地说目标拟合的公式是这样的: Dρ(ωv,ωl)cosθl D\approx \rho(\omega_v,\omega_l)\cos{\theta_l} 对一个各向同性的材料来说,BRDF取决于入射角度ωv=(sinθv,0,cosθv)\omega_v=(\sin{\theta_v},0,\cos{\theta_v})和粗糙度α\alpha。因此,对于任意一个(θ)v,α)(\theta)v,\alpha)组合,都要找出一个矩阵MM能最好你和他,由于平面BRDF的各向同性,以及LTC的缩放不变性,M可以表示为,公式(6) M=[a0b0c0d01] M=\begin{bmatrix} a & 0 & b \\ 0 & c & 0 \\ d & 0 & 1 \end{bmatrix} 因此,有四个参数需要拟合,作者的经验是最小化L3L^3误差能产生一个最好的结果。

存储

根据公式(3)可以看到,在任何情况下,其实都只需要一个逆矩阵M1M^{-1},对各向同性的BRDF,矩阵可以由4个参数决定。另外,还需要一位记录拟合的BRDF的范数Ωρ(ωv,ωl)cosθldωl\int_{\Omega}\rho(\omega_v,\omega_l)\cos{\theta_l}\mathrm{d}\omega_l,所以一共需要5个参数。使用一个分辨率为64×6464 \times 64的2D的纹理来记录,其中θ[0,π2]\theta \in [0,\frac{\pi}{2}]a[0,1]\sqrt{a} \in [0, 1]

计算过程

计算收到的多边形光源的扩散(Diffuse)光,意味着计算在这个多边形域上光照度的积分,公式(7): I=PL(ωl)ρ(ωv,ωl)cosθldωl I=\int_{P}L(\omega_l)\rho(\omega_v,\omega_l)\cos{\theta_l}\mathrm{d}\omega_l 其中ωv\omega_v是支教方向,ρ\rho是BRDF,PP是多边形,LL是在ωl\omega_l角上收到的多边形光源发出的辐射。为了使用LTC,在运行时,我们取出LTCDDM1M^{-1}、入射角θv\theta_v和BSDF的粗糙度α\alpha,因此可以将公式(7)近似为公式(8): I=PL(ωl)ρ(ωv,ωl)cosθldωlPL(ωl)D(ωl)dωl I=\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 接下来就可以用到之前所说的变换了变换了

着色辐射均匀的多边形光源

如果,多边形在空间上发出的辐射是一致的,那么L(ωl)=LL(\omega_l)=L,因此可以将辐射项提出积分公式,得到公式(9): I=PL(ωl)D(ωl)dωl=LPD(ωl)dωl I=\int_{P}L(\omega_l)D(\omega_l)\mathrm{d}\omega_l=L\int_{P}D(\omega_l)\mathrm{d}\omega_l 由于之前所说的公式(3),可以将分布DD转换会原始分布DoD_o上去,从而得到公式(10): 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) 其中,EE表示多边形Po=M1PP_o=M^{-1}P的辐射。而这个辐射可以用公式(11)近似计算: E(p1,...,pn)=12πi=1narccos(pi,pj)pi×pjpi×pj,[001] E(p_1,...,p_n)=\frac{1}{2\pi}\sum_{i=1}^{n}\arccos(\langle p_i,p_j\rangle)\langle \frac{p_i\times p_j}{\|p_i\times p_j\|},\begin{bmatrix} 0 \\ 0 \\ 1 \end{bmatrix}\rangle 其中j=(i+1)modnj=(i+1)\mod n。需要注意的是,这里需要提前将位于球面下侧的多边形裁减掉。

着色带纹理的多边形光源

本章介绍了如果光的颜色是用二维的彩色纹理表示的情况。此时公式(8)需要被重写为公式(12): IPL(ωl)D(ωl)dωl=IDIL I\approx\int_{P}L(\omega_l)D(\omega_l)\mathrm{d}\omega_l=I_DI_L 其中 ID=PD(ωl)dωl I_D=\int_{P}D(\omega_l)\mathrm{d}\omega_l IL=PL(ωl)D(ωl)dωlPD(ω)dωl I_L=\frac{\int_{P}L(\omega_l)D(\omega_l)\mathrm{d}\omega_l}{\int_{P}D(\omega)\mathrm{d}\omega_l} 这样做的好处是将公式分解了,因为这两部分有不同的性质。

高光的形状

IDI_D可以按照之前的公式进行计算,它描述在积分的大小,体现在高光部分的形状上。

高光的颜色

ILI_L可以被看作在某处的平均颜色,可以表示为一个纹理空间的滤波的结果,因此通过对颜色纹理的预先高斯滤波可以获得ILI_L的近似值。

纹理的预先滤波

根据ILI_L的定义,可以将它看作纹理LL一个滤波器F(ωl)=D(ωl)PD(ωl)dωlF(\omega_l)=\frac{D(\omega_l)}{\int_{P}D(\omega_l)\mathrm{d}\omega_l},而这个公式可被近似为对纹理空间的一个高斯滤波。这个近似还需要满足两个条件:

  1. 在球面之下的部分F=0F=0,也就是说,光不能从平面下泄露出来。
  2. 在纹理内FF是正规化的,PF(ωl)dωl=1\int_{P}F(\omega_l)\mathrm{d}\omega_l=1

为了做到这个,需要在纹理中裁剪并重新正规化纹理空间高斯。需要在纹理的边缘增加一个边缘,在边缘上时扩大滤波的半径使他能和纹理相交。在边缘的外部,需要将坐标裁剪到边缘。结果类似下图:

如何取纹理

取纹理的部分需要有两个参数:纹理的坐标和LOD。直接计算平均向量和纹理的交点会有一定问题,因为有的时候纹理可能和平均向量根本没有交点。同时计算LOD也不方便。

为了解决这个问题,依然是将分布转换回原始分布,利用公式(15): IL=PL(ωl)D(ωl)dωlPD(ωl)dωl=PoL(ωl)Do(ωl)dωlPoDo(ωl)dωl I_L=\frac{\int_{P}L(\omega_l)D(\omega_l)\mathrm{d}\omega_l}{\int_{P}D(\omega_l)\mathrm{d}\omega_l}=\frac{\int_{P_o}L(\omega_l)D_o(\omega_l)\mathrm{d}\omega_l}{\int_{P_o}D_o(\omega_l)\mathrm{d}\omega_l} 根据作者的说法,这样做的好处是在DoD_o分布下参数化纹理空间的滤波更加简单、鲁棒。

取得预滤波的纹理

现在取纹理颜色只要取得着色点正交投影在纹理上的位置的颜色即可。因为用的是正交投影说一没有各向异性的问题,LOD的大小为到纹理平面的距离的平方r2r^2和多边形大小AA的比值,鲁博士使用的高斯滤波的标准差为σ=r22A\sigma=\sqrt{\frac{r^2}{2A}}

至此,本文的主要思想就介绍完了。