袁璐
(四川大學(xué)計(jì)算機(jī)學(xué)院,成都 610065)
隨著計(jì)算機(jī)硬件處理能力的不斷提升,計(jì)算機(jī)圖形學(xué)也迎來(lái)了嶄新的局面。全局光照模擬作為計(jì)算機(jī)圖形學(xué)中活躍的研究方向,在增強(qiáng)圖像渲染的真實(shí)感上扮演者不可或缺的角色。全局光照的模擬一直以來(lái)被廣泛的應(yīng)用在不同的領(lǐng)域,如卡通片繪制、電影制作以及游戲渲染等。然而由于全局光照計(jì)算量耗費(fèi)巨大很難達(dá)到實(shí)時(shí)渲染,因此快速渲染成為了全局光照的重要研究方向之一。
立即輻射度算法作為全局光照算法中的一種,減少了預(yù)計(jì)算部分,使全局光照實(shí)時(shí)化成了可能。然而由于為達(dá)到真實(shí)的渲染效果,目前大部分基于立即輻射度的算法都是離線渲染的。因此為提升渲染效率,本文立將即輻射度算法應(yīng)用到GPU上,同時(shí)通過(guò)Lightcuts算法進(jìn)行進(jìn)一步的加速計(jì)算。
Keller在1997年提出立即輻射度算法,該算法的核心思想是利用光照輻射度的特性,在場(chǎng)景中被直接光照照亮的地方生成二次光源,即虛擬點(diǎn)光源。并用這些虛擬點(diǎn)光源進(jìn)行直接光照計(jì)算,從而代替復(fù)雜光照計(jì)算,模擬出真實(shí)的全局光照效果。雖然該算法的提出讓全局光照的研究方向有了很大發(fā)展,但該算法即使在對(duì)僅有402個(gè)面片的場(chǎng)景進(jìn)行渲染時(shí),也需要花費(fèi)24秒的時(shí)間。
因此Walter等人于2005年在立即輻射度算法基礎(chǔ)上提出的Lightcuts算法,通過(guò)對(duì)場(chǎng)景中生成的虛擬點(diǎn)光源進(jìn)行聚類(lèi),并用二叉樹(shù)將相似的光源進(jìn)行合并以減少場(chǎng)景中虛擬點(diǎn)光源的數(shù)量,渲染效率有了很大的提升。
本文通過(guò)用OpenGL渲染管線計(jì)算立即輻射度算法中光線跟蹤和虛擬點(diǎn)光源生成的過(guò)程,再結(jié)合Lightcuts算法減少虛擬點(diǎn)光源的數(shù)量,最后通過(guò)延遲著色(deferred shading)進(jìn)一步加速光照計(jì)算。
立即輻射度算法計(jì)算主要分為兩部分:虛擬點(diǎn)光源創(chuàng)建和光照計(jì)算。
在虛擬點(diǎn)光源創(chuàng)建部分,首先對(duì)場(chǎng)景中的原始光源隨機(jī)選取方向生成初始光線,再跟蹤初始光線并判斷光線是否與場(chǎng)景有交點(diǎn),若有交點(diǎn)則在得到的交點(diǎn)上創(chuàng)建虛擬點(diǎn)光源。虛擬點(diǎn)光源的位置信息和法線信息與得到的交點(diǎn)相同。與基于物理的方法不同,為提升渲染效率,本文中虛擬點(diǎn)光源的貢獻(xiàn)度不通過(guò)貢獻(xiàn)度計(jì)算公式計(jì)算,而是直接將交點(diǎn)處的漫反射材質(zhì)屬性作為虛擬點(diǎn)光源的貢獻(xiàn)度。同時(shí)本文只考慮一次間接光照,即虛擬點(diǎn)光源只生成一次,只考慮原始光源生成的初始光線與場(chǎng)景相交,不考慮虛擬點(diǎn)光源再次生成光線與場(chǎng)景相交。
在虛擬點(diǎn)光源間接光照計(jì)算部分,對(duì)每個(gè)著色點(diǎn)計(jì)算每個(gè)光源對(duì)其光照貢獻(xiàn)度,并將光照貢獻(xiàn)度進(jìn)行累加,作為著色點(diǎn)最后的光照值。
Lightcuts算法提高場(chǎng)景渲染速率的本質(zhì)是對(duì)場(chǎng)景中光源的數(shù)量進(jìn)行簡(jiǎn)化。通常來(lái)說(shuō),場(chǎng)景中的光源數(shù)量減少由此會(huì)導(dǎo)致渲染結(jié)果嚴(yán)重失真。然而由于人眼察覺(jué)變化的能力有限,所以只需把減弱后的光源亮度控制在人眼不能察覺(jué)的范圍內(nèi),就可達(dá)到減少光源數(shù)目而渲染結(jié)果亦不失真的目的。根據(jù)韋伯定律,在最壞的情況下,人眼能夠察覺(jué)的亮度的變化通常僅僅在原始亮度的1%之下。但通過(guò)實(shí)驗(yàn)表明,將誤差閾值控制在2%也能得到較好的渲染結(jié)果。算法實(shí)現(xiàn)步驟如下。
(1)構(gòu)建光源樹(shù)
光源樹(shù)是一棵二叉樹(shù),葉節(jié)點(diǎn)為原始虛擬點(diǎn)光源,內(nèi)部節(jié)點(diǎn)為代表性光源。光源樹(shù)的構(gòu)建需要比較兩個(gè)光源的相似度,相似度的計(jì)算如公式(1)所示:
對(duì)于點(diǎn)光源常量c恒為0,公式(1)可變?yōu)椋?/p>
其中Ic為兩個(gè)光源的亮度之和,αc表示兩個(gè)光源軸對(duì)齊包圍盒的對(duì)角線長(zhǎng)度。權(quán)值W越小,則兩個(gè)光源的相似度越高。
根據(jù)公式(2)光源樹(shù)構(gòu)造的具體步驟為:
1)選取原始光源中的一個(gè)光源作為起始光源a,遍歷剩余光源,查找與光源a相似度最高,即公式中W最小的光源b。
2)為光源a與光源b構(gòu)建父節(jié)點(diǎn),在兩個(gè)光源之中隨機(jī)選取一個(gè)光源作為代表性光源。對(duì)于光源a,有Ia/(Ia+Ib)的概率被選中為代表性光源。
3)將代表性光源加入光源集合中,并在光源集合中刪除光源a和光源b。
4)重復(fù)步驟1-3,直至光源集合中只剩一個(gè)光源,即所建光源樹(shù)的根節(jié)點(diǎn),至此建樹(shù)完成。
(2)計(jì)算光照估算值及其上界
Walter等給出的每個(gè)像素上光照貢獻(xiàn)度計(jì)算公式為(3)所示:
其中,S為所有原始虛擬點(diǎn)光源的點(diǎn)集,i為其中一個(gè)光源,x為像素上一點(diǎn),ω為視點(diǎn)方向,M為光源i的材質(zhì)因子,G為光源i的幾何因子,V代表光源i的可見(jiàn)性,I表示光源i的亮度。
為簡(jiǎn)化運(yùn)算,可用光源樹(shù)上代表性光源k的材質(zhì)項(xiàng)、幾何項(xiàng)、可見(jiàn)項(xiàng)來(lái)近似代替所有葉節(jié)點(diǎn)原始光源。則公式(3)變換為:
其中,C為一簇光源點(diǎn)集,C?S,k為代表性光源。
Walter給出估算LC(x,ω )上界的方法,如公式(5)所示:
圖1
(3)裁剪光源樹(shù)
光源樹(shù)裁剪的最終目的是得到一系列可代替原始光源的光源節(jié)點(diǎn)的集合,即一條光源割(lightcut)。由韋伯定律,人眼能感知的亮度變化為原始亮度的1%,而Walter等用實(shí)驗(yàn)證明原始亮度的2%作為誤差閾值就能得到很好的渲染結(jié)果。因此上界與估算值的誤差只要小于原始光源亮度估算值的2%,則估算值便可作為精確值的近似,并且可認(rèn)為是人眼不易察覺(jué)的誤差。
依據(jù)韋伯定律,光源樹(shù)的裁剪過(guò)程如下:
1)對(duì)于每個(gè)像素點(diǎn),從光源樹(shù)的根節(jié)點(diǎn)開(kāi)始,將根節(jié)點(diǎn)壓入備選池中,并計(jì)算其上界值Lˉ()x,ω 與估算值L(x,ω)。
最后剩余在備選池中的點(diǎn)即為對(duì)應(yīng)像素點(diǎn)的一條光源割。對(duì)于每個(gè)像素點(diǎn)都有一條光源割,在渲染時(shí)用這條光源割上的光源取代原始光源進(jìn)行計(jì)算。
本文虛擬點(diǎn)光源的生成和光照計(jì)算都是在GPU上實(shí)現(xiàn)的。為了存儲(chǔ)在計(jì)算著色器(Compute Shader)中計(jì)算得到的虛擬點(diǎn)光源,同時(shí)在CPU與GPU中進(jìn)行數(shù)據(jù)傳遞,在OpenGL4.3版本的支持下,本文采用著色器存儲(chǔ)緩沖區(qū)對(duì)象(Shader Storage Buffer Object,SSBO)作為光源的存儲(chǔ)結(jié)構(gòu)。為增加物體的層次感和深度感,本文對(duì)每個(gè)光源都做了一次陰影映射(Shadow Mapping)以產(chǎn)生直接陰影和間接陰影。
本文算法主要流程如圖1所示。
首先在CPU端將場(chǎng)景和原始光源載入,同時(shí)對(duì)場(chǎng)景建立坐標(biāo)軸對(duì)稱(chēng)包圍盒(Axis-Aligned Bounding Box,AABB),該包圍盒用作后續(xù)的光線求交。
然后在GPU端對(duì)場(chǎng)景先渲染一次,獲得場(chǎng)景的位置、法線和顏色信息,并存在叫做G緩沖(G-Buffer)的紋理中。
再對(duì)原始光源隨機(jī)選取N個(gè)方向,作為初始光線。跟蹤光線,判斷光線與場(chǎng)景包圍盒是否有交,若光線與場(chǎng)景包圍盒有交點(diǎn),則生成一個(gè)虛擬點(diǎn)光源,且將交點(diǎn)處的位置、法線和漫反射紋理信息賦值給該虛擬點(diǎn)光源,然后把該虛擬點(diǎn)光源存入SSBO中。
接著在CPU端對(duì)得到的虛擬點(diǎn)光源根據(jù)公式建立光源二叉樹(shù),將該光源二叉樹(shù)轉(zhuǎn)換成二維數(shù)組,存入一張紋理中傳入GPU端。
最后結(jié)合第一遍渲染管線得到的場(chǎng)景幾何信息,為每個(gè)片元選擇合適的光源割,將光源割用作延遲著色光照計(jì)算。
本文實(shí)驗(yàn)采用配置為Intel Core i3 4160的CPU,NVIDIA GeForce GTX 960的顯卡,DDR3 8G的內(nèi)存。在1個(gè)初始光源的康奈爾盒中,產(chǎn)生100個(gè)VPL的渲染效果如圖2所示。
圖2
本文在相同的硬件環(huán)境和場(chǎng)景下,對(duì)使用了Lightcuts算法和未使用Lightcuts算法的進(jìn)行了對(duì)比。實(shí)驗(yàn)場(chǎng)景中初始光源為1個(gè),未使用Lightcuts產(chǎn)生了400個(gè)虛擬點(diǎn)光源,幀率為34fps。而使用Lightcuts裁剪后虛擬點(diǎn)光源數(shù)量變?yōu)?82個(gè),幀率為59fps,渲染效果對(duì)比如圖3所示。
立即輻射度算法是一種不需要預(yù)處理的近似全局光照算法,通過(guò)在直接光照照射點(diǎn)上產(chǎn)生虛擬點(diǎn)光源,進(jìn)而模擬出間接光照的效果。因此特別適合用作實(shí)時(shí)全局光照計(jì)算。由于目前大部分基于立即輻射度的算法都是非實(shí)時(shí)渲染,因此本文基于GPU渲染管線的支持,提出了一種實(shí)時(shí)的立即輻射度實(shí)現(xiàn)的方法,并得到較好的渲染效果。
同時(shí)本文對(duì)走樣現(xiàn)象未作處理,且未考慮復(fù)雜場(chǎng)景,不能滿足大型動(dòng)態(tài)場(chǎng)景的實(shí)時(shí)渲染。另外本文實(shí)驗(yàn)場(chǎng)景都是基于漫反射材質(zhì),因此喪失了鏡面材質(zhì)等的全局光照效果。以上缺陷都是本文接下來(lái)的研究重點(diǎn)。
參考文獻(xiàn):
[1]Kajiya J T.The Rendering Equation[J].Acm Siggraph Computer Graphics,1986,20(4):143-150.
[2]Keller A.Instant radiosity[C].Proceedings of the 24th Annual Conference on Computer Graphics and Interactive Techniques.1997:49-56.
[3]Segovia B,Iehl J C,Péroche B.Metropolis Instant Radiosity[J].Computer Graphics Forum,2007,26(3):425–434.
[4]Laine S,Saransaari H,Kontkanen J,et al.Incremental Instant Radiosity for Real-Time Indirect Illumination[C].Eurographics Symposium on Rendering Techniques,Grenoble,France.DBLP,2008:277-286.
[5]Dong Z,Grosch T,Ritschel T,et al.Real-time Indirect Illumination with Clustered Visibility[J].Proc Vision Modeling&Visualization,2009.
[6]Walter B,Fernandez S,Arbree A,et al.Lightcuts:A Scalable Approach to Illumination.ACM Transactions on Graphics,2005,24(3):1098-1107.
[7]Walter B,Arbree A,Bala K,et al.Multidimensional lightcuts[C].ACM SIGGRAPH.ACM,2006:1081-1088.
[8]Walter B,Khungurn P,Bala K.Bidirectional lightcuts[J].ACM Transactions on Graphics,2012,31(4):1-11.