【圖形學(xué)筆記】實時范圍光Area Light渲染及其數(shù)學(xué)原理推導(dǎo)

引言
????在燈光渲染中,點光、平行光和聚光燈的實現(xiàn)較為容易,原因是要么光源為一個定點或者光線方向恒定。但范圍光Area Light四面八方的光源來自連續(xù)的表面,實現(xiàn)方法有本質(zhì)上的不同。對于離線渲染可以通過路徑追蹤(蒙特卡洛積分)暴力解算,但是在實時渲染中需要更為巧妙的方式實現(xiàn)。

? ? 前幾天我和同學(xué)復(fù)刻了一下基于LTC (Linear Transformed Cosines)?的實時范圍光渲染,所以打算寫一篇筆記分享一下學(xué)習(xí)過程。教程[3]和文獻[1][4]來源會放在文末的引用中。如果筆記內(nèi)容有誤請多多指正

前置知識
????前置知識涉及部分輻射計量學(xué)、渲染方程以及簡易積分。我當(dāng)時由于這部分基礎(chǔ)不太牢(學(xué)的不系統(tǒng)),在后續(xù)的數(shù)學(xué)推導(dǎo)中浪費了很多時間去補充,所以這個部分我盡量寫細(xì)一些。
立體角
????用于描述一個立體方位和輻照積分的積分域,通常用ω表示,而θ和φ(或者α)可以看做是空間極坐標(biāo)系中兩個用于描述方位的角度。需要注意的是θ是法向和特定方向的夾角,而不是特定方向和水平圓面的夾角,這個定義會影響后續(xù)積分時的表達。

值得一提的是,對于立體角的球面積分的過程為:
所以
可以理解為在單位球面上的面積微元,其與兩個方位角的微分關(guān)系為
通過計算球面某一區(qū)域的面積即可求得該面積所對應(yīng)的立體角
輻照度?Irradiance
這個物理量我感覺是PBR中最總要的一個,其定義為:
為輻射通量,在圖形學(xué)中一般表示為光的亮度(vec3,
)
為受光面積,其中
為正對面積,
的作用是將受光面積轉(zhuǎn)換為正對面積
特別的是,對于輻照度半球積分,假設(shè)任意方向的輻照度都為1
所以在圖形學(xué)中,輻照度積分都要除以π來歸一化:
渲染方程
一定程度上,出射光線等于無數(shù)條入射光線的加權(quán)和,其中BDRF函數(shù)(
)就代表著出射光和某一條入射光的比例關(guān)系,我認(rèn)為這是實現(xiàn)Area Light的核心思想之一

范圍光
????在給定視角方向(需要求出出射光線的方向)、法線方向?,F(xiàn)在需要做的就是在范圍光的光源(也就是自發(fā)光多面體)上進行加權(quán)采樣,最后求得該出射光方向上的光線。

積分轉(zhuǎn)化
????很明顯,在實時渲染中無法對幾何體進行采樣,也無法讓BRDF和幾何體的球面投影進行卷相乘,因為時間復(fù)雜度太大了。不過學(xué)者[1][4]提出了一種很牛的思路,將幾何體面采樣轉(zhuǎn)換為有限的邊緣求和(積分)

某N變形幾何體的球面投影(傳統(tǒng)積分的對象)為
其球面投影在圓盤面
上的投影為
其二者的換算關(guān)系為
這個換算過程可以理解為投影,跟輻照度中正對面積的
是一個原理
于是神奇的事情發(fā)生了,通過積分換底(Jacobian),從原來的球面立體角的面積變成了投影的面積
邊緣積分
接下來的任務(wù)就是計算多面體在球面的投影在圓盤的投影的面積

這部分的操作是逐邊緣計算有符號子面積然后求和。給出任意兩個圓心指向頂點的向量,公式為:
相當(dāng)于先求出一個完整的圓?。▋蓚€頂點矢量和球面上的圓弧組成)的面積,然后投影回圓盤
所有邊的積分式為:
LTC Linearly Transformed Cosines
Learn OpenGL CN沒有翻譯這篇文章,我也沒找到中文翻譯。大致意思是由多種線性變換一個半球余弦分布函數(shù)的集合。

假設(shè)我們的范圍光是均一的,輻射通量為定值,則積分公式:
其中不難看出這個積分(加權(quán)和)所采用的權(quán)重分布函數(shù)為上圖中的第三種,Clamped Cosine(正半球余弦分布)
其中的
同樣是為了保證權(quán)重的半球積分結(jié)果為1
線性變換
????很明顯,現(xiàn)在的求和方式僅能針對粗糙度為0的情況,來自自發(fā)光多邊形的入射光全部以漫反射發(fā)射出去,為了模擬BRDF對于粗糙度變化、視角變化(甚至材質(zhì)各向異性變化),需要將初始權(quán)重分布函數(shù)應(yīng)用一個三乘三線性變換矩陣去擬合入射光和反射光在不同材質(zhì)和攝像機角度下的權(quán)重分布。這也就是這個技術(shù)中“Linearly Transformed”的含義

由此一來,對入射光的權(quán)重分布函數(shù)將獲得近似BRDF的權(quán)重分布,即:
這里順便把渲染方程中的
一起乘上了,畢竟是權(quán)重分布而不是簡單地BRDF分布

但是根據(jù)邊緣積分公式的推導(dǎo),邊緣積分僅適用于的分布情況,所以在渲染中要將自發(fā)光多面體進行
變換。從而計算邊緣積分,這步非常重要。

最終的渲染方程就是
其中第一項是漫反射項,第二項是高光項
和
是典中典之菲涅爾過渡,
是指自發(fā)光多面體(Polygonal Light)展開的話就是
關(guān)于三乘三矩陣
將粗糙度變換、各向異性變換、攝像機角度變換,三個三乘三矩陣依次相乘即可得出用于擬合BRDF的變換矩陣,即
又因為a,b,c,d的具體數(shù)字只與兩個變量有關(guān):粗糙度、攝像機與法線的夾角。那么接下來就是典中典之查表環(huán)節(jié)了。將abcd分別對應(yīng)像素的RGBA,橫縱坐標(biāo)分別為粗糙度(在論文中為了粗糙度變化平滑,采用作為粗糙度軸)和攝像機與法線的夾角。即可存儲為一張LUT,在渲染的時候以讀取紋理的形式構(gòu)建變換矩陣
效果


其他三維軟件中的Area Light大多以矩形和橢圓形為主,但是論文和教程中使用的技術(shù)遠(yuǎn)遠(yuǎn)打過如此。LTC可以解決任意面數(shù)任意形態(tài)的自發(fā)光光源,并且支持燈光貼圖。
關(guān)于燈光貼圖

這部分還沒實現(xiàn),大致思路是對貼圖先進行預(yù)積分,跟IBL一樣,然后根據(jù)燈光距離和表面粗糙度進行線性插值(大概)
實現(xiàn)方法
詳見Learn OpenGL網(wǎng)站[3],里面有詳細(xì)的代碼實現(xiàn)和更全面的文獻資料。
特別特別感謝大佬同學(xué)幫我在渲染器里實現(xiàn)了范圍光,GitHub@theta-lin
引用
[1] Real-Time Polygonal-Light Shading with Linearly Transformed Cosines, ACM Siggraph '16?
[2]?Understanding the concept of Solid Angle,?ENGINEERING STREAMLINED (Youtube)
[3] Area Lights, LearnGL guest articles 2022?
[4]?Geometric Derivation of the Irradiance of Polygonal Lights,?Eric Heitz