概述
如果我們有一個上半球的余弦分布函數(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}}?ω=?ωo?Ar2cosθ?
這就是一個立體角的定義。讓我們來探討一下里面的面積與距離的表達吧!
偷懶一下,可以從圖中看到面積與距離的表達,那么讓我們來化簡一下吧。
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)\mathrmze8trgl8bvbq\omega = \int_{\Omega}D_{o}\frac{\partial\omega_{o}}{\omega}\mathrmze8trgl8bvbq\omega = \int_{\Omega}D_{o}(\omega_{o})\mathrmze8trgl8bvbq\omega_{o}∫Ω?D(ω)dω=∫Ω?Do?ω?ωo??dω=∫Ω?Do?(ωo?)dωo?
其次對于多邊形積分相等:
∫PD(ω)dω=∫PoDo(ωo)dωo\int_{P}D{(\omega)}\mathrmze8trgl8bvbq\omega = \int_{P_{o}}D_{o}(\omega_{o})\mathrmze8trgl8bvbq\omega_{o}∫P?D(ω)dω=∫Po??Do?(ω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))=π1?max(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=???a0d?0c0?b01????
可以看見這個矩陣只有四個參數需要被確定。
可以從圖中看出擬合效果很不錯!
使用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}\mathrmze8trgl8bvbq\omega_{l}I=∫P?L(ωl?)ρ(ωv?,ωl?)cosθl?dω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}\mathrmze8trgl8bvbq\omega_{l} \approx\int_{P}L(\omega_{l})D({\omega_{l})}\mathrmze8trgl8bvbq\omega_{l}I=∫P?L(ωl?)ρ(ωv?,ωl?)cosθl?dωl?≈∫P?L(ω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})}\mathrmze8trgl8bvbq\omega_{l} = L\int_{P}D(\omega_{l})\mathrmze8trgl8bvbq\omega_{l}I=∫P?L(ωl?)D(ωl?)dωl?=L∫P?D(ωl?)dωl?
我們再進行積分變換:
∫PD(ω)dω=∫PoDo(ωo)dωo=E(Po)\int_{P}D(\omega)\mathrmze8trgl8bvbq\omega = \int_{P_{o}}D_{o}(\omega_{o})\mathrmze8trgl8bvbq\omega_{o} = E(P_{o})∫P?D(ω)dω=∫Po??Do?(ω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=1n?acos(<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的網站,想了解更詳細的內容可以看看哦!
對那充滿不安的日子說再見吧,對那充滿不安的日子說再見吧,對那充滿不安的日子說再見吧,
向著未知的夢境之地前行,向著未知的夢境之地前行,向著未知的夢境之地前行,
我想總有一日我會變得更加堅強!我想總有一日我會變得更加堅強!我想總有一日我會變得更加堅強!
總結
以上是生活随笔為你收集整理的Polygonal-Light Shading with LTC的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。