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