邱玉凱
(四川大學(xué)計(jì)算機(jī)學(xué)院,成都610065)
光照算法在計(jì)算機(jī)圖形學(xué)中具有顯著的重要性,其主要內(nèi)容是模擬由光源發(fā)射出的光線在場(chǎng)景中的行進(jìn)過程及在該過程中對(duì)場(chǎng)景顏色的影響,使得場(chǎng)景從視覺上更加符合人們的認(rèn)知。早期圖形學(xué)中的光照算法由于受限于計(jì)算復(fù)雜度,通常僅計(jì)算光線第一次與場(chǎng)景相交時(shí)對(duì)場(chǎng)景的影響,稱為局部光照(Local Illumination)模型。而考慮光線在行進(jìn)過程中與場(chǎng)景發(fā)生多次反彈對(duì)場(chǎng)景產(chǎn)生間接影響的光照模型則稱為全局光照(Global Illumination)模型。全局光照模型的主要理論基礎(chǔ)是Kajiya[1]在1986 年給出的渲染方程,該方程使用遞歸的方式計(jì)算間接光照,具有很大的計(jì)算量,因此實(shí)質(zhì)上幾乎所有的全局光照算法都僅考慮有限的反彈次數(shù)來模擬近似的光照結(jié)果。
全局光照對(duì)于增強(qiáng)虛擬場(chǎng)景的視覺真實(shí)感具有十分突出的貢獻(xiàn),圖1 中給出了全局光照與局部光照的對(duì)比結(jié)果,可以明顯看出左圖中建筑之內(nèi)呈現(xiàn)為黑色,這是因?yàn)樵摬糠植辉谥苯庸庹辗秶鷥?nèi),處于陰影部分;而右圖中建筑之內(nèi)雖然仍然是處于直接光照的陰影中,但由于受到來自于庭院反射的間接光照,因此能夠看到更多的細(xì)節(jié),使得場(chǎng)景更加接近于真實(shí)的光照效果。

圖1 全局光照和局部光照的對(duì)比
在全局光照算法的研究領(lǐng)域中,學(xué)者們提出了大量的研究方法,包括基于深度G-Buffer[2]、基于體素[3]、基于輻射度[4-5]、基于點(diǎn)[9-10]、基于光線追蹤等等方式,這些方法都在某種程度上在保證光照結(jié)果與真實(shí)情況相似的情況下,提高渲染的效率。
為了滿足實(shí)時(shí)交互的需求,通常使用相對(duì)粗略的近似方式,僅計(jì)算包含一次反彈的間接漫反射光照。基于該思想,Dachsbacher 和Stamminger 在2005 年提出了反射陰影圖(Reflective Shadow Maps,RSMs)算法,通過附加一個(gè)包含深度及所受光照值等信息的陰影圖來表達(dá)虛擬點(diǎn)光源(Virtual Point Light,VPL),在渲染階段收集所有虛擬點(diǎn)光源的光照以產(chǎn)生一次間接光照。該算法也成為后續(xù)許多相關(guān)研究算法的基礎(chǔ)。而這種在陰影圖上生成點(diǎn)光源的方式在一定程度上極大依賴于光源信息,當(dāng)光源距離場(chǎng)景較遠(yuǎn)時(shí),場(chǎng)景中物體在陰影圖所占的有效區(qū)域較小,容易造成生成的虛擬點(diǎn)光源的代表性較差,降低渲染質(zhì)量。在物體空間生成VPL 的方法,如文獻(xiàn)[6-7]等,雖然生成虛擬點(diǎn)光源的方式不再依賴于光源,但需要大量的預(yù)計(jì)算,并使用樹形結(jié)構(gòu)進(jìn)行管理。本文中所使用的方法,雖然同樣是在物體空間生成VPL,但不需要任何預(yù)計(jì)算,也不依賴于任何樹形結(jié)構(gòu),每幀實(shí)時(shí)生成虛擬點(diǎn)光源,因此本文算法適用于動(dòng)態(tài)場(chǎng)景。
基于物體空間生成虛擬點(diǎn)光源,通常將物體中每個(gè)三角形網(wǎng)格作為一個(gè)潛在的虛擬點(diǎn)光源。而存在于物體中的三角形,往往大小形狀各異,為了使得大三角形對(duì)光照結(jié)果具有更大的貢獻(xiàn),本文將對(duì)較大的三角形進(jìn)行處理,將其細(xì)分為多個(gè)稍小的三角形。這樣同樣存在另外一個(gè)問題,在復(fù)雜的場(chǎng)景中,三角形網(wǎng)格的數(shù)量龐大,若不使用在預(yù)處理階段處理三角形生成虛擬點(diǎn)光源,實(shí)時(shí)生成虛擬點(diǎn)光源,將大大增加計(jì)算量,就目前來說,很顯然并不具有可行性。
為了解決該問題,本文算法參考LightCut[8]提出的光源裁剪方法,隨機(jī)裁剪掉大部分的三角形網(wǎng)格,僅在剩下的三角形網(wǎng)格上生成虛擬點(diǎn)光源。與之不同的是,本文算法裁減三角形的過程是在運(yùn)行時(shí)完成,不需要在預(yù)處理階段生成虛擬點(diǎn)光源,也不需要使用樹形結(jié)構(gòu)進(jìn)行管理以產(chǎn)生光源切割。
本文所使用算法的主要流程如圖2 所示。

圖2 本文所使用算法的主要流程
(1)在模型加載階段,為每個(gè)頂點(diǎn)綁定一個(gè)隨機(jī)數(shù),該隨機(jī)數(shù)將在之后進(jìn)行隨即裁剪時(shí)使用;
(2)生成G-Buffer,保存場(chǎng)景的頂點(diǎn)位置、法線及漫反射顏色信息;
(3)在幾何著色器中進(jìn)行三角形網(wǎng)格的篩選,使用三角形網(wǎng)格的面積與給定的閾值進(jìn)行比較,超過閾值的三角形網(wǎng)格將被標(biāo)記為大三角形,需要將這些大的三角形網(wǎng)格通過Transform Feedback Buffer 回傳到細(xì)分著色器細(xì)分,而對(duì)于滿足條件的三角形網(wǎng)格,將根據(jù)隨機(jī)數(shù)進(jìn)行裁剪。
(4)在細(xì)分著色器中將根據(jù)三角形網(wǎng)格的面積將其細(xì)分為多個(gè)稍小三角形網(wǎng)格,并為細(xì)分后的小三角形網(wǎng)格中的每個(gè)頂點(diǎn)綁定一個(gè)隨機(jī)數(shù)。
(5)該步驟將在剩下的三角形網(wǎng)格上生成虛擬點(diǎn)光源,三角形網(wǎng)格的顏色,法線及中心點(diǎn)位置將作為虛擬點(diǎn)光源的顏色,法線和位置。
(6)使用虛擬點(diǎn)光源計(jì)算間接光照,結(jié)合局部光照,形成最終的全局光照。
基于上述流程,本文將在接下來的內(nèi)容詳細(xì)介紹三角形網(wǎng)格裁剪和生成虛擬點(diǎn)光源過程及間接光照計(jì)算公式的推導(dǎo)。
本文將在標(biāo)準(zhǔn)硬件光柵化管線中并行地生成虛擬點(diǎn)光源。在生成虛擬點(diǎn)光源時(shí),將三角形網(wǎng)格劃分到多個(gè)分層L0<…<LN中。分層的方法為:首先定義一組閾值{S0<…<SN},Sk可以理解為L(zhǎng)k層三角形網(wǎng)格面積的均值。其中S0的計(jì)算方法:

其中,Navg表示當(dāng)前著色點(diǎn)附近虛擬點(diǎn)光源數(shù)量的均值,Dnear表示當(dāng)前著色點(diǎn)與這些的距離。若場(chǎng)景半徑為Rscene,則令Dnear=0.2×Rscene且Navg處于64 和1024 之間,Navg越大得到的渲染質(zhì)量則越高,而效率則會(huì)降低,因此這取決于渲染質(zhì)量和渲染時(shí)間的均衡。
其他閾值Sk的計(jì)算可由S0表示:

其中,μ 為一個(gè)自定義的正整數(shù),且滿足μ >1。
雖然較小的三角形網(wǎng)格將對(duì)場(chǎng)景產(chǎn)生很小的貢獻(xiàn),但我們?nèi)匀徊荒苤苯硬眉舻羲休^小三角形網(wǎng)格,因?yàn)樵S多精細(xì)的模型表面會(huì)存在大片連續(xù)的小三角形網(wǎng)格,這些小三角形網(wǎng)格可能具有非常重要的貢獻(xiàn)。為了解決這個(gè)問題,這里的解決方案是:為每個(gè)三角形ti綁定一個(gè)介于0 到1 之間的隨機(jī)數(shù)uti。若滿足三角形網(wǎng)格的面積A( ti)>utiS0,則保留該三角形網(wǎng)格。一個(gè)三角形被保留下來的概率為:

其中L 為所有三角形網(wǎng)格的集合,L*表示被保留下來的三角形網(wǎng)格。由此可以看出越小的三角形網(wǎng)格被保留下來的概率就越小。對(duì)于整個(gè)場(chǎng)景來說,最終被保留下來的三角形網(wǎng)格數(shù)量的期望值為其中Ascene為整個(gè)場(chǎng)景的面積。
裁剪掉小三角形網(wǎng)格后,將剩下的三角形網(wǎng)格隨機(jī)分配到L0<…<LN中,則三角形網(wǎng)格滿足各層保留條件的概率為:

為了輔助劃分三角形網(wǎng)格,這里引入一組與Sk對(duì)應(yīng)的閾值并使用隨機(jī)數(shù)來表示分層:

則有:

表示三角形網(wǎng)格屬于第k 層的概率。因此,有:

令S'0=S0,可得:


圖3 著色點(diǎn)計(jì)算間接光照
在計(jì)算間接光照時(shí),著色點(diǎn)將受到來自于周圍虛擬點(diǎn)光源的光照影響,如圖3 所示。這里每個(gè)虛擬點(diǎn)光源都可近似作為點(diǎn)光源處理。間接光照計(jì)算公式可以表示為:


其中yi為虛擬點(diǎn)光源的中心點(diǎn)為虛擬點(diǎn)光源ti到沿方向的輻射度,ρx為著色點(diǎn)反照度,di為yi到x 之間的距離。
而對(duì)每個(gè)虛擬點(diǎn)光源來說,虛擬點(diǎn)光源由直接光源處獲得能量,該過程屬于一次直接光照,光照公式為:

ρi為虛擬點(diǎn)光源顏色,為直接光的輻照度。需要注意的是,由于的存在,這里所使用的公式已經(jīng)不再是完美的Lambert 光照模型,不過經(jīng)過實(shí)驗(yàn)證明,這對(duì)最終結(jié)果并沒有出現(xiàn)重要的影響,但卻能大大減輕之后即將進(jìn)行的計(jì)算。乘上是為了確保能量的守恒。
本文通過累加L0~LN集合中所有虛擬點(diǎn)光源對(duì)場(chǎng)景光照的貢獻(xiàn)形成間接光照。則對(duì)著色點(diǎn)x 的間接光照K 可以表示為:

通過表示K 的期望:可得:



這樣一來,我們就將公式(14)中無偏的問題轉(zhuǎn)換為一個(gè)單一問題,即找到一組fk,使得滿足:

為了使得fk能夠表示不同的輻射范圍,引入一組類似嵌套球的函數(shù)Bh( )ti,來代表在某個(gè)特定的h 值下,對(duì)著色點(diǎn)的貢獻(xiàn)較為顯著的虛擬點(diǎn)光源集合,h 可以理解為對(duì)一個(gè)閾值,Bh( ti)中所有虛擬點(diǎn)光源均有大于或等于h,即:



為了使得fk函數(shù)平滑,可采用連續(xù)的分段函數(shù)來表示:


圖4 fk 函數(shù)的可視化結(jié)果
(1)硬件環(huán)境:Intel Core i3-6100 CPU @ 3.70GHz處理器,8GB 內(nèi)存,NVIDIA RTX 2060 顯卡
(2)軟 件 環(huán) 境:Windows 10 x64,Visual Studio,OpenGL
(1)場(chǎng)景G-Buffer 結(jié)果
圖5 展示了對(duì)應(yīng)用場(chǎng)景生成的G-Buffer 的各種信息。


圖5 場(chǎng)景G-Buffer中各圖結(jié)果
(2)場(chǎng)景局部光照和全局光照效果的對(duì)比

圖6 局部光照和全局光照的對(duì)比
圖6 給出了局部光照和本文算法實(shí)現(xiàn)的全局光照效果,圖(a)中方向光無法照到的陰影部分呈現(xiàn)為純黑色,而圖(b)中陰影部分則展現(xiàn)出更多的場(chǎng)景細(xì)節(jié),可以明顯看到宮殿右側(cè)墻壁因?yàn)榻邮盏接勺髠?cè)墻壁和綠色龍雕像反射的間接光照而被照亮。
(3)效率及效果分析
表1 中給出了對(duì)場(chǎng)景按照不同的Navg得到的幀率情況及場(chǎng)景局部效果的對(duì)比。
由表1 結(jié)果可以看出,在不借助任何預(yù)計(jì)算生成虛擬點(diǎn)光源的情況下,本文算法仍然能夠維持在一個(gè)較高的幀率實(shí)時(shí)計(jì)算間接光照。當(dāng)然,根據(jù)Navg值的不同,也存在一定效果上的差異,這是因?yàn)樵趫?chǎng)景半徑固定的情況下,當(dāng)Navg值較小時(shí),根據(jù)公式(1),S0的值將變得更大,會(huì)裁剪掉更多的三角形網(wǎng)格,使得場(chǎng)景中生成的虛擬點(diǎn)光源數(shù)量較小,對(duì)光照結(jié)果產(chǎn)生相對(duì)較大的誤差;而隨著Navg值的增大,產(chǎn)生的虛擬點(diǎn)光源也隨之增多,光照結(jié)果也越接近真實(shí)情況,如表中Navg=512 和Navg=1024 的結(jié)果已經(jīng)基本完全一致,但卻會(huì)帶來較大的幀率損耗。
本文算法考慮在物體空間生成虛擬點(diǎn)光源,通過為每個(gè)三角形網(wǎng)格綁定一個(gè)隨機(jī)數(shù)進(jìn)行隨機(jī)裁減,為了區(qū)別場(chǎng)景幾何中大三角形網(wǎng)格和小三角形網(wǎng)格對(duì)場(chǎng)景光照的貢獻(xiàn),在幾何著色器中篩選出大三角形,并將其細(xì)分為多個(gè)稍小三角形。同時(shí)本文算法所生成的虛擬點(diǎn)光源不需要任何額外的預(yù)處理過程,也不依賴于樹形結(jié)構(gòu)進(jìn)行管理。最后結(jié)合間接光照計(jì)算公式,推導(dǎo)出一種適合本算法的快速間接光照計(jì)算公式,并通過實(shí)驗(yàn)驗(yàn)證了該方式計(jì)算間接光照的可行性。
本文雖然能夠提供良好的間接光照效果,但由于隨機(jī)裁減的方式,會(huì)存在部分結(jié)果精度的損失,且本文算法在實(shí)現(xiàn)時(shí),由于受限于算法本身,在大型場(chǎng)景中無法具有表現(xiàn)良好的效率,可以結(jié)合分塊著色、交叉采樣等算法進(jìn)行效率優(yōu)化。

表1 根據(jù)采用不同Navg 時(shí)的幀率及局部效果情況對(duì)比