陳學(xué)超
(四川大學(xué)計(jì)算機(jī)學(xué)院,成都610065)
全局光照算法能渲染光線傳播過程中產(chǎn)生的漫反射、光澤反射等現(xiàn)象,大幅提高畫面真實(shí)感,但普遍具有計(jì)算量大、實(shí)時(shí)性差等缺點(diǎn)?;诠庹仗结樀娜止庹账惴ɡ迷趫?chǎng)景中離散分布的探針對(duì)光照進(jìn)行預(yù)計(jì)算和存儲(chǔ),能有效減少渲染時(shí)間。目前基于該算法的環(huán)境貼圖技術(shù)[1]、實(shí)時(shí)輻射亮度架構(gòu)[2]等已被廣泛應(yīng)用于計(jì)算機(jī)輔助設(shè)計(jì)、游戲等多個(gè)領(lǐng)域。
光場(chǎng)探針(Light Field Probe)方法[3]是一種實(shí)時(shí)生成全局光照效果的典型預(yù)計(jì)算方法。通過在預(yù)計(jì)算階段對(duì)光場(chǎng)進(jìn)行離散采樣,場(chǎng)景的幾何信息和輻射亮度信息被編碼在光場(chǎng)探針結(jié)構(gòu)中?;陬A(yù)計(jì)算的光場(chǎng)探針結(jié)構(gòu),該算法能實(shí)時(shí)生成間接漫反射和光澤反射效果。然而,高昂的預(yù)計(jì)算代價(jià)使得該算法只能處理靜態(tài)場(chǎng)景,因?yàn)閯?dòng)態(tài)的光源或物體會(huì)使得預(yù)計(jì)算的光照數(shù)據(jù)或幾何數(shù)據(jù)失效。近年來,不少工作嘗試在動(dòng)態(tài)光源或動(dòng)態(tài)場(chǎng)景下實(shí)時(shí)渲染全局光照效果。Silvennoinen 等人[4]結(jié)合了預(yù)計(jì)算輻射亮度傳輸技術(shù)[5]和球諧函數(shù)來實(shí)時(shí)生成動(dòng)態(tài)光源全局光照效果。Majercik 等人[6]基于RTX 光線追蹤對(duì)場(chǎng)景的幾何和光照信息進(jìn)行實(shí)時(shí)稀疏采樣,支持動(dòng)態(tài)場(chǎng)景下實(shí)時(shí)渲染漫反射效果。
本文對(duì)光場(chǎng)探針方法進(jìn)行擴(kuò)展,提出一種動(dòng)態(tài)光源下實(shí)時(shí)生成漫反射和光澤反射效果的算法。該算法的基本思想是對(duì)光場(chǎng)探針中存儲(chǔ)的輻射亮度場(chǎng)信息進(jìn)行實(shí)時(shí)重建,而不是在預(yù)計(jì)算階段去生成它們,這使得該算法能夠進(jìn)一步處理動(dòng)態(tài)光源。為了高效完成光場(chǎng)探針輻射亮度場(chǎng)的重建,本文提出一種稱為L(zhǎng)ight-GBuffer 的數(shù)據(jù)結(jié)構(gòu),用來存儲(chǔ)光源處的徑向距離和材質(zhì)信息。通過結(jié)合實(shí)時(shí)生成的Light-G-Buffer 以及預(yù)計(jì)算的幾何信息,本文算法能高效重建動(dòng)態(tài)光源場(chǎng)景下的輻射亮度場(chǎng),從而更新光場(chǎng)探針結(jié)構(gòu),達(dá)到響應(yīng)光照動(dòng)態(tài)變化的目的。具體而言,本文的主要貢獻(xiàn)如下:
●提出一種稱為L(zhǎng)ight-G-Buffer 的數(shù)據(jù)結(jié)構(gòu),用于支持動(dòng)態(tài)光源下實(shí)時(shí)渲染全局光照效果;
●提出一種高效的輻射亮度場(chǎng)重建方法,用于實(shí)時(shí)渲染高質(zhì)量的漫反射和光澤反射效果。
本文算法針對(duì)光場(chǎng)探針技術(shù)[3]不適用于動(dòng)態(tài)光源這一問題做出改進(jìn),能夠在動(dòng)態(tài)光源下實(shí)時(shí)生成漫反射和光澤反射效果。在預(yù)計(jì)算階段,光場(chǎng)探針技術(shù)在探針處同時(shí)生成并存儲(chǔ)幾何信息和輻射亮度信息。二者耦合導(dǎo)致預(yù)計(jì)算的光照信息在光源發(fā)生改變后失效,因此該方法難以應(yīng)用于動(dòng)態(tài)光源場(chǎng)景。
為了響應(yīng)動(dòng)態(tài)光源變化,本文提出一種名為L(zhǎng)ight-G-Buffer 的數(shù)據(jù)結(jié)構(gòu),用于解耦光場(chǎng)探針中的幾何信息和輻射亮度信息。本文算法在光源處采樣徑向材質(zhì)和深度信息并存儲(chǔ)到Light-G-Buffer 結(jié)構(gòu)中,這些信息能夠用于在運(yùn)行時(shí)重建光場(chǎng)探針的輻射亮度場(chǎng)信息。這使得在預(yù)計(jì)算階段只需為光場(chǎng)探針生成幾何信息,而不必生成輻射亮度信息,達(dá)到實(shí)時(shí)響應(yīng)動(dòng)態(tài)光照的目的。
基于光場(chǎng)探針中預(yù)計(jì)算的幾何信息以及光源處的Light-G-Buffer,光場(chǎng)探針的輻射亮度信息能夠被實(shí)時(shí)重建出來。對(duì)于一個(gè)給定的光場(chǎng)探針和入射輻射亮度的方向,本文算法首先根據(jù)該入射方向采樣光場(chǎng)探針的幾何信息得到著色點(diǎn)的表面法線和世界空間位置,然后根據(jù)著色點(diǎn)的世界空間位置采樣Light-G-Buffer得到著色點(diǎn)表面材質(zhì)。最后,基于采樣的著色點(diǎn)法線和材質(zhì)信息,本文算法應(yīng)用延遲著色能準(zhǔn)確計(jì)算光場(chǎng)探針給定方向的入射輻射亮度。第2 節(jié)將詳細(xì)闡述該算法細(xì)節(jié)。圖1 展示了本文算法的基本流程,該流程被分成三個(gè)階段:預(yù)計(jì)算,重建以及著色階段。值得注意的是,后兩個(gè)階段均發(fā)生在運(yùn)行時(shí)。
●預(yù)計(jì)算階段:與光場(chǎng)探針方法類似,本文算法也需要預(yù)計(jì)算階段來在探針位置上通過光柵化的方式生成場(chǎng)景的法線和徑向距離信息,以立方體貼圖或八面體貼圖形式存儲(chǔ)。圖1 中S-1,2 展示了均勻放置的探針網(wǎng)格以及探針存儲(chǔ)的預(yù)計(jì)算紋理數(shù)據(jù)。
●重建階段:如圖1 中S-3 所示,Light-G-Buffer可視作額外添加材質(zhì)信息的全向陰影貼圖,用于存儲(chǔ)場(chǎng)景的材質(zhì)和徑向距離,以立方體貼圖形式存儲(chǔ)。圖1中S-4 展示了輻射亮度場(chǎng)重建過程,其中,Light-GBuffer 和探針中的徑向距離被用于可見性判斷,從而剔除不可見光源的光照貢獻(xiàn)。圖1 中S-5 展示了重建的輻射亮度場(chǎng)及卷積后的輻射照度場(chǎng)。
●著色階段:如圖1 中S-6,7 所示,本文算法通過輻射照度插值計(jì)算漫反射效果,通過使用與重建輻射亮度場(chǎng)相似的方法計(jì)算視點(diǎn)相關(guān)的光澤反射效果。
基于間接反射的光照僅來源于光源照射的區(qū)域的假設(shè),本文在光源處渲染Light-G-Buffer 來捕獲場(chǎng)景光照信息。Light-G-Buffer 可以以立方體貼圖或者八面體貼圖的形式進(jìn)行存儲(chǔ)。如第1 節(jié)所述,本文在Light-G-Buffer 中存儲(chǔ)材質(zhì)信息而不是輻射亮度信息,這是因?yàn)槿肷漭椛淞炼鹊挠?jì)算是視點(diǎn)相關(guān)的,在光源處計(jì)算入射輻射亮度會(huì)產(chǎn)生有偏的間接光照結(jié)果。此外,一種可行的替代方法是將材質(zhì)信息存儲(chǔ)在光場(chǎng)探針結(jié)構(gòu)中。但是,該方法在內(nèi)存層面非常低效,因?yàn)橄噜彽奶结槙?huì)捕獲到相似而冗余的材質(zhì)信息。圖1 的S-1 展示了本文提出的Light-G-Buffer 數(shù)據(jù)結(jié)構(gòu)。
圖1 本文算法渲染流程
輻射亮度場(chǎng)的重建需要實(shí)現(xiàn)從光場(chǎng)探針出發(fā)的任意方向角計(jì)算入射輻射亮度。如圖1 的S-4 所示,對(duì)于給定的探針pprobe,方向的入射輻射亮度是從點(diǎn)p'處發(fā)出,計(jì)算來自于點(diǎn)p'的入射輻射亮度等價(jià)于以視點(diǎn)方向ω→o對(duì)點(diǎn)p'進(jìn)行著色。本文算法通過迭代場(chǎng)景中的所有光源,累加它們的光照貢獻(xiàn)來對(duì)p' 點(diǎn)著色。p'點(diǎn)的入射輻射亮度可以直接從光源獲取。此外,因?yàn)楸疚脑谔结樚庮A(yù)計(jì)算高分辨率的幾何信息,p'點(diǎn)的法線信息能從探針中查詢得到。除了入射輻射亮度以及法線信息,為了對(duì)p'點(diǎn)著色,還需要獲取p'的材質(zhì)信息。p'點(diǎn)的材質(zhì)信息可以從Light-G-Buffer 中查詢得到。公式(1)被用來計(jì)算探針pprobe的入射輻射亮度。
其中,N是光源數(shù)量,和分別是點(diǎn)p'的光線入射和出射方向,fr是雙向反射分布函數(shù),可以結(jié)合第i個(gè)光源處的Light-G-Buffer 中以方向采樣的材質(zhì)信息求得,是探針的預(yù)計(jì)算幾何信息中以方向采樣所得的法線。
此外,由于p' 點(diǎn)的材質(zhì)信息可能被多個(gè)光源的Light-G-Buffer 所記錄,從不可見的光源查詢的材質(zhì)信息Mi是不正確的,同時(shí)不可見光源的光照貢獻(xiàn)應(yīng)被剔除在輻射亮度計(jì)算之外。因此,Light-G-Buffer 額外存儲(chǔ)的深度信息提供可見性項(xiàng)Vi,用于處理這種錯(cuò)誤情況。當(dāng)且僅當(dāng)通過Light-G-Buffer 記錄的p'點(diǎn)的深度信息以及光場(chǎng)探針記錄p' 點(diǎn)的深度信息映射到世界空間中的同一位置時(shí),方可認(rèn)為光源與p' 相互可見,此時(shí)Vi=1,Light-G-Buffer 記錄的材質(zhì)信息和光照貢獻(xiàn)時(shí)有效的。具體的計(jì)算方式如公式(2)所示。
其中,δ是可調(diào)節(jié)的可見性判斷閾值,d是分別從探針以及Light-G-Buffer 查詢得到的p'的深度信息反算出來的世界空間位置的距離,滿足公式(3)。
通過上述公式,本文算法能從光場(chǎng)探針的任意方向角出發(fā)計(jì)算入射輻射亮度,進(jìn)而完成輻射亮度場(chǎng)的重建。在每個(gè)探針位置,本文算法使用隨機(jī)旋轉(zhuǎn)的Fibonacci spiral 模式采樣球面方向的M根光線,并計(jì)算其入射輻射亮度。這些入射輻射亮度的值隨后被編碼到2D 紋理中存儲(chǔ),得到輻射亮度貼圖。為了計(jì)算漫反射光照,輻射亮度貼圖會(huì)根據(jù)公式(4)卷積過濾得到輻射照度貼圖。
其中,表示卷積法半球的主方向,是第i個(gè)球面采樣方向,M'是法半球內(nèi)的采樣光線數(shù),是相應(yīng)的入射輻射亮度。
本文算法利用延遲渲染和陰影圖技術(shù)計(jì)算直接光照,采用與光場(chǎng)探針方法類似的方式計(jì)算間接漫反射和光澤反射。算法能夠在運(yùn)行時(shí)重建輻射亮度場(chǎng)以及根據(jù)輻射亮度場(chǎng)卷積過濾得到輻射照度場(chǎng)。對(duì)于漫反射效果,本文以著色點(diǎn)法向量n→為采樣方向,對(duì)著色點(diǎn)周圍8 個(gè)探針的輻射照度進(jìn)行采樣和插值,進(jìn)而計(jì)算著色點(diǎn)漫反射輻射亮度,計(jì)算過程如圖1 中的S-6 所示。由于重建輻射亮度場(chǎng)的采樣光線較少,卷積過濾后的輻射照度貼圖會(huì)存在幀間閃爍現(xiàn)象。為減輕幀間閃爍現(xiàn)象對(duì)最終著色效果的影響,本文將前后幀輻射照度以比率α混合,進(jìn)行時(shí)域上的濾波,大大減輕了閃爍現(xiàn)象。在實(shí)驗(yàn)中,α被設(shè)置在0.75 至0.95 之間。
對(duì)于光澤反射效果,基于光場(chǎng)探針的光線追蹤算法被用于計(jì)算反射光線與場(chǎng)景交點(diǎn),并采用與重建輻射亮度場(chǎng)類似方法(見第2.1 小節(jié)),在探針位置重建交點(diǎn)處在視點(diǎn)方向的出射輻射照度。與前文輻射照度重建的方式不同的是,光澤反射光線與場(chǎng)景交點(diǎn)是視點(diǎn)相關(guān)的,而不是從探針中查詢得到。除此之外,本文算法在輻射照度重建和光澤光線反射上都采用相同的著色方程進(jìn)行運(yùn)行時(shí)計(jì)算,見式(1)。
此外,本文算法對(duì)公式(1)和(4)進(jìn)行擴(kuò)展以計(jì)算多次反射后間接光照效果。不失一般性,在光線多次反射后,點(diǎn)p的入射輻射亮度能表示為每一次反射入射輻射亮度的累加:。本文根據(jù)上一次的著色結(jié)果計(jì)算本次反射后的入射輻射亮度,從而實(shí)現(xiàn)多次反射效果的迭代式計(jì)算。在實(shí)現(xiàn)算法時(shí),我們將多次反射的迭代式計(jì)算分?jǐn)傊炼鄮M(jìn)行。值得注意的是,本文假設(shè)間接光照僅來自于直接光源照亮的區(qū)域,而多次反射后反射光線照亮區(qū)域?qū)χc(diǎn)間接光照亦有貢獻(xiàn)。當(dāng)著色點(diǎn)與光源不可見時(shí),從Light-G-Buffer中獲取的著色點(diǎn)材質(zhì)信息可能并不準(zhǔn)確,由此計(jì)算的多次反射后間接光照效果存在誤差。但多次反射后的間接光照會(huì)隨著反彈次數(shù)的增加迅速衰減,對(duì)最終著色結(jié)果影響較小。實(shí)驗(yàn)結(jié)果表明,基于Light-G-Buffer計(jì)算得到多次反射后的著色誤差較小,在人眼視覺感知可接受范圍內(nèi)。
本文算法在NVIDIA RTX 2080Ti GPU 以及Intel Core i9-9900K CPU 上實(shí)現(xiàn)。本節(jié)實(shí)驗(yàn)時(shí)使用參數(shù)如下:除特別標(biāo)注外,所有實(shí)驗(yàn)結(jié)果均以1920×1080 的分辨率進(jìn)行渲染;在球面采樣時(shí)使用32×32 根采樣光線,生成分辨率為32×32 輻射亮度圖和距離圖;在計(jì)算光澤反射效果時(shí)使用分辨率為1024×1024 的距離圖和法線圖;Light-G-Buffer 分辨率為1024×1024×6。
實(shí)驗(yàn)一:對(duì)比幾種算法的動(dòng)態(tài)光源下的全局光照效果
通過使用Light-G-Buffer 對(duì)輻射亮度場(chǎng)進(jìn)行重建,本文算法實(shí)現(xiàn)了動(dòng)態(tài)光源下實(shí)時(shí)生成漫反射和光澤反射效果。圖2 展示了含動(dòng)態(tài)光源的康奈爾盒在三個(gè)不同時(shí)刻下渲染結(jié)果。從實(shí)驗(yàn)結(jié)果可見,本文算法渲染的漫反射和光澤反射效果與原光場(chǎng)探針方法渲染結(jié)果視覺上無明顯差異。DDGI 方法利用光線跟蹤更新探針中的輻射照度場(chǎng),實(shí)現(xiàn)動(dòng)態(tài)場(chǎng)景下漫反射效果的實(shí)時(shí)渲染。由于輻射照度場(chǎng)采樣率不足產(chǎn)生了較嚴(yán)重的閃爍現(xiàn)象。因此與DDGI 方法相比,其余兩種方法的漫反射效果更顯著。此外,該方法并未對(duì)光澤反射效果提供支持。
圖2 本文算法和光場(chǎng)探針方法[3]以及DDGI方法[6]在動(dòng)態(tài)光源下不同時(shí)刻的全局光照效果對(duì)比
實(shí)驗(yàn)二:驗(yàn)證多次反射的全局光照效果的正確性
我們將本文算法和光場(chǎng)探針方法進(jìn)行多次反射的全局光照效果對(duì)比。圖3 展示了附帶龍模型的康奈爾盒場(chǎng)景中,在一次反射到多次反射的條件下,本文算法和光場(chǎng)探針?biāo)惴ㄗ罱K渲染結(jié)果的差異。本文算法一次反射的著色效果與光場(chǎng)探針的實(shí)驗(yàn)結(jié)果幾乎相同(見圖3 中第一列),可見本文算法能夠準(zhǔn)確重建一次反射后的入射輻射亮度。對(duì)于多次反射光照效果,著色時(shí)獲取的材質(zhì)信息存在不正確的情形。最后一列展示了多次反射的著色效果,局部區(qū)域與光場(chǎng)探針的實(shí)驗(yàn)結(jié)果略有不同??傮w而言,本文算法渲染的多次反射效果誤差較小,在視覺上可信。
實(shí)驗(yàn)三:本文算法的繪制編耗時(shí)分析
我們?cè)诓煌瑘?chǎng)景下對(duì)本文算法各個(gè)繪制遍耗時(shí)進(jìn)行分析。本文算法有效地減少探針間冗余光照信息,因此在內(nèi)存占用上小于光場(chǎng)探針?biāo)惴?。此外,在渲染相同質(zhì)量的圖像時(shí),本文算法需要更新Light-G-Buffer和輻射亮度場(chǎng),因此渲染時(shí)間略多于光場(chǎng)探針方法,具體的各個(gè)繪制遍耗時(shí)見表1。
圖3 本文算法與光場(chǎng)探針方法[3]在多次反射條件下的全局光照效果對(duì)比
表1
表1 本文算法繪制一幀的各繪制遍耗時(shí),加粗部分是本文算法相比光場(chǎng)探針?biāo)惴╗3]額外增加的繪制遍。
本文提出了一種通過運(yùn)行時(shí)構(gòu)建的Light-GBuffer 以及預(yù)計(jì)算的幾何信息中高效重建輻射亮度場(chǎng)的方法,該方法能夠生成動(dòng)態(tài)光源下的間接漫反射和光澤反射效果。本文提出的Light-G-Buffer 數(shù)據(jù)結(jié)構(gòu)解耦了輻射亮度和幾何信息,不僅減少了預(yù)計(jì)算開銷,而且還提供了處理動(dòng)態(tài)光源的可能性。Light-G-Buffer在重建輻射亮度中起著關(guān)鍵的作用。在延遲渲染中,它的作用類似于G-Buffer,能夠減少冗余著色計(jì)算。此外,它還被用于在著色點(diǎn)和光源之間的可見性測(cè)試。