劉曉蕓,姚承宗,曾曉勤
(河海大學(xué)計(jì)算機(jī)與信息學(xué)院,江蘇 南京 211100)
在真實(shí)感圖形繪制中,全局光照能夠?yàn)閳鼍疤峁└鼮樨S富的光影效果,通過計(jì)算光線的多次反射、折射能夠產(chǎn)生更為逼真的光影細(xì)節(jié)。早期實(shí)現(xiàn)全局光照繪制的算法主要有光線跟蹤[1]、輻射度[2]、光子映射[2]等。這些基于間接光照的算法,需計(jì)算光線在物體之間的多次反射、折射,與光源特性、場景中物體的物體特性以及物體的相對空間位置等有關(guān),因而計(jì)算量巨大。
隨著可編程GPU出現(xiàn),涌現(xiàn)出一些使用GPU對全局光照進(jìn)行加速的算法。如周昆[1]等提出了在CUDA上構(gòu)建KD樹的新算法,核心是對KD樹中的大結(jié)點(diǎn)和小結(jié)點(diǎn)分別處理,該方法能夠充分利用GPU的并行計(jì)算能力,明顯提高渲染速度。但大結(jié)點(diǎn)分割質(zhì)量比較低,而且排序過程的計(jì)算量比較大。Wang等人[5]提出一種基于GPU的分割數(shù)據(jù)采樣和插值的全局光照方法,該方法通過自適應(yīng)的K值聚類,將場景分割成條理分明的簇,對每一個(gè)簇使用基于GPU的光子圖法來計(jì)算其輻照度,最終將每一個(gè)光子圖切片整合。由于分割只進(jìn)行了極有限次數(shù)的采樣,該方法會(huì)丟失一些幾何特征,并且在實(shí)現(xiàn)上受限于現(xiàn)存的時(shí)序算法。
為了提高渲染速度,有一些通過犧牲渲染精度為代價(jià)的方法被提出,如Keller[6]提出將來自一個(gè)反射面的反射光線擬合成一組虛擬點(diǎn)光源來簡化計(jì)算,但這一方法忽視了折射和反射的細(xì)節(jié)。Dachsbacher[7]通過機(jī)器學(xué)習(xí)的方法,根據(jù)不同的能見度對場景進(jìn)行分層,對能見度較高的層,用精度較高全局光照模型進(jìn)行計(jì)算,對于能見度較低的層,則使用精度較低的模型進(jìn)行計(jì)算。采用該方法渲染的場景部分區(qū)域較為精細(xì),而其它部分較為粗糙。Kaplanyan[8]通過三維場景中的光能傳播來擬合間接光照值,然而其只能擬合漫反射表面的間接光照。
還有一些方法通過預(yù)計(jì)算的方法來實(shí)現(xiàn)全局光照的實(shí)時(shí)繪制。如Sloan[9]提出的預(yù)計(jì)算輻射亮度傳輸(precomputed radiance transfer PRT),在靜態(tài)場景中將物體表面的低頻光照包括全局光照產(chǎn)生的陰影以及物體相互之間的反射關(guān)系等轉(zhuǎn)化成輻射度傳輸,從而計(jì)算靜態(tài)環(huán)境對于各個(gè)方向光源的反射數(shù)據(jù)等,在進(jìn)行渲染時(shí)調(diào)用這些計(jì)算結(jié)果,可以實(shí)現(xiàn)動(dòng)態(tài)低頻光照的全局光照效果。由于動(dòng)態(tài)的光源和高頻發(fā)光之間的相互反射,繪制動(dòng)態(tài)場景的效果不理想。Ren等人[10]則構(gòu)建了一個(gè)多層前饋神經(jīng)網(wǎng)絡(luò)作為光照回歸函數(shù)(radiance regression function RRF)來擬合間接光照值,通過預(yù)先渲染好的場景作為導(dǎo)師數(shù)據(jù)對網(wǎng)絡(luò)進(jìn)行訓(xùn)練,使用訓(xùn)練好的網(wǎng)絡(luò)擬合間接光照值,能實(shí)現(xiàn)場景的實(shí)時(shí)渲染,然而其網(wǎng)絡(luò)過于復(fù)雜,冗余數(shù)據(jù)較多,收斂較慢,并且無法實(shí)現(xiàn)動(dòng)態(tài)場景的擬合。
徑向基函數(shù)(Radial Basis Function, RBF)神經(jīng)網(wǎng)絡(luò)[11]能夠逼近任意的非線性函數(shù),可以處理難以解析表示的映射,具有良好的泛化能力和較快的學(xué)習(xí)收斂速度,已成功應(yīng)用于非線性函數(shù)逼近、時(shí)間序列分析、數(shù)據(jù)分類、模式識別、信息處理、圖像處理、系統(tǒng)建模、控制和故障診斷等方面。RBF網(wǎng)絡(luò)是一個(gè)局部逼近網(wǎng)絡(luò),也就是對輸入空間的某個(gè)局部區(qū)域只有少數(shù)幾個(gè)連接權(quán)值影響輸出,因此它較每一個(gè)權(quán)值都要調(diào)整的全局逼近網(wǎng)絡(luò)具有更快的收斂速度。
本文將回歸分析方法引入全局光照的渲染過程之中,使用RBF神經(jīng)網(wǎng)絡(luò)構(gòu)建學(xué)習(xí)模型,對通過蒙特卡洛光線跟蹤方法得到的光照樣本數(shù)據(jù)集進(jìn)行學(xué)習(xí),確定每個(gè)基函數(shù)單元的寬度、中心及隱含層與輸出層單元之間的權(quán)值矩陣,從而發(fā)掘出每個(gè)場景對象表面可見點(diǎn)的特征屬性之間的非線性關(guān)聯(lián)。實(shí)驗(yàn)表明,基于RBF神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)模型的全局光照技術(shù)可以很好地?cái)M合蒙特卡洛離線渲染的結(jié)果,用其構(gòu)建神經(jīng)網(wǎng)絡(luò)模型來擬合光照計(jì)算,可以避免傳統(tǒng)光線跟蹤過程中繁雜的光線求交計(jì)算,在確保渲染精度的同時(shí),提高了場景渲染的速度。
針對點(diǎn)光源的靜態(tài)場景,由Peter[12]提出的光照方程,可以得到在視點(diǎn)Θ處觀察到場景中點(diǎn)x處的反射光照強(qiáng)度為
(1)
Lr(x→Θ)=Ldirect+Lindirect
(2)
其中Ψ為光源位置,Ωx為x點(diǎn)附近的球面,fr表示點(diǎn)x位置處的雙向反射分布函數(shù)(Bidirectional Reflectance Distribution Function, BRDF),Nx表示點(diǎn)x位置處的表面法向量,Li表示點(diǎn)x位置處來自方向i的入射光亮度。G(x,y)表示x與y的光線傳輸幾何關(guān)系,V(x,y)表示兩者的能見度關(guān)系。
根據(jù)BRDF的定義,有
(3)
由于場景中物體表面都是固定的,可以看出,BRDF是一個(gè)與點(diǎn)x的位置、入射光線和視點(diǎn)位置有關(guān)的函數(shù),因而可以將其簡化為如下三元組
fr(x,Ψ→Θ)=fr(f(x),Ψ,Θ)
(4)
式(2)中Ldirect表示直接光照值,Lindirect表示間接光照值。
對于Ldirect部分,本文采用自適應(yīng)采樣的蒙特卡洛方法來進(jìn)行加速,Lindirect部分則通過RBF網(wǎng)絡(luò)進(jìn)行模擬。
為了敘述方便,對公式進(jìn)行歸一化,用n表示x處的單位法向量,s表示光源方向單位向量,v表示視點(diǎn)方向單位向量,可以將Lindirect部分簡化為
(5)
本文對間接光照的解決方法是將其視為一個(gè)神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)問題來解決。
根據(jù)式(5)可以定義一個(gè)與x,s,v,n,f有關(guān)的函數(shù)Lin用來擬合Lindirect
Lindirect≈Lin(x,s,v,n,f)
(6)
對于確定的場景,Lin是一個(gè)固定的函數(shù),可以通過計(jì)算光線傳輸來得到任意視點(diǎn)、光源以及位置x處的Lin函數(shù)。如果采用傳統(tǒng)的光線跟蹤算法進(jìn)行計(jì)算,因涉及到光線多次求交的問題,算法復(fù)雜性很高。
本文采用RBF神經(jīng)網(wǎng)絡(luò)方法,根據(jù)不同場景的特征值,擬合出一個(gè)該場景下計(jì)算間接光照值的函數(shù),避免了光線求交計(jì)算,實(shí)現(xiàn)靜態(tài)場景的實(shí)時(shí)渲染。
根據(jù)式(6)可以構(gòu)建如圖1所示的RBF神經(jīng)網(wǎng)絡(luò),這是一個(gè)R12+nf到R3[r,g,b]的映射。
圖1 RBF神經(jīng)網(wǎng)絡(luò)
其中x=(a1,a2,a3),s=(a4,a5,a6),v=(a7,a8,a9),n=(a10,a11,a12),f=(a13,…,a12+nf),將訓(xùn)練網(wǎng)絡(luò)得到的擬合函數(shù)記為Lnet。通過擬合函數(shù)計(jì)算每個(gè)像素的間接光照值
B=[r,g,b]=Lnet(x,s,v,n,f)
(7)
采用監(jiān)督學(xué)習(xí)算法對網(wǎng)絡(luò)所有的參數(shù)(RBF的寬度、中心及隱含層到輸出層的權(quán)值矩陣)進(jìn)行訓(xùn)練。主要工作是對代價(jià)函數(shù)進(jìn)行梯度下降,然后修正每個(gè)參數(shù)。
通過減聚類算法[13],將得到的聚類中心作為RBF的中心Φi(i=1…P)。采用減聚類算法原因在于在該算法中,數(shù)據(jù)集本身作為聚類中心的候選集。算法所涉及的計(jì)算量與數(shù)據(jù)點(diǎn)的數(shù)目之間呈現(xiàn)為簡單的線性關(guān)聯(lián),與維數(shù)無關(guān),可以有效減小網(wǎng)絡(luò)規(guī)模。具體過程如下
針對ΩZ中的元素,根據(jù)減聚類的定義推導(dǎo)出其密度指標(biāo)計(jì)算式(8)
(8)
4) 對式(8)密度指標(biāo)迭代公式進(jìn)行修正,得到新的密度指標(biāo)迭代式(9),選取密度指標(biāo)最高的數(shù)據(jù)點(diǎn)作為新的聚類中心。
(9)
選取好聚類中心Φi(i=1…P)后,采用隨機(jī)分布,初始化隱含層到輸出層的權(quán)值wi。采用梯度下降法對網(wǎng)絡(luò)中的三種參數(shù)都進(jìn)行監(jiān)督訓(xùn)練優(yōu)化,代價(jià)函數(shù)的表現(xiàn)形式見式(10),表示網(wǎng)絡(luò)輸出和理想輸出的方差與輸入規(guī)模的比值。
(10)
在合成一副圖像的時(shí)候,不同區(qū)域的灰度值變化不同,細(xì)節(jié)的豐富程度也不一樣。對于細(xì)節(jié)比較豐富的圖像區(qū)域,需要進(jìn)行較多次數(shù)的采樣,才能詳細(xì)的描述出該區(qū)域的細(xì)節(jié)特征。而針對細(xì)節(jié)比較少的圖像區(qū)域,進(jìn)行較少次數(shù)的采樣就能描述出該區(qū)域的細(xì)節(jié)特征。自適應(yīng)采樣算法[14]就是根據(jù)圖像當(dāng)前區(qū)域細(xì)節(jié)的豐富程度決定其采樣次數(shù)。
具體實(shí)現(xiàn)時(shí),首先采用均勻分布的方式分布初始采樣點(diǎn)。
然后,采用非局部均值方法去噪,在合成圖像的時(shí)候,生成兩個(gè)采樣點(diǎn)相同的緩沖區(qū)域A和B。
假設(shè)在緩沖區(qū)A中有兩個(gè)相鄰像素點(diǎn)p和q,在對像素點(diǎn)p進(jìn)行去噪處理時(shí),首先計(jì)算在緩沖區(qū)A中以p為中心的區(qū)域和以q為中心的區(qū)域之間的加權(quán)歐氏距離,計(jì)算公式見式(11),其中,f為區(qū)域大小。
(11)
通過式(12)求出權(quán)值。
(12)
將求取的權(quán)值代入式(13)去計(jì)算B緩沖區(qū)的圖像。
(13)
同理,使用B緩沖區(qū)中得到的權(quán)值去計(jì)算A緩沖區(qū)中的圖像,這樣可以消除濾波系數(shù)和噪聲之間的相關(guān)性。最后利用兩幅圖像之間的差值來表示錯(cuò)誤率,其計(jì)算見式(14),其中N(p,f)表示這一區(qū)域的均值。
(14)
錯(cuò)誤率越高,表示這一區(qū)域的細(xì)節(jié)越豐富,根據(jù)錯(cuò)誤率來重新分配采樣點(diǎn)。
如此反復(fù)迭代,完成采樣,之后用經(jīng)典的光線跟蹤算法完成直接光照部分的渲染。
完成對RBF網(wǎng)絡(luò)的訓(xùn)練之后,便得到了擬合函數(shù)Lnet,可以用其對間接光照值進(jìn)行擬合,得到該場景中不同光源位置和視點(diǎn)位置情況下各點(diǎn)的顏色值。
對于一組視點(diǎn)V和光源S,可以得到在該視點(diǎn)下需要渲染的場景點(diǎn)x,計(jì)算得到x處的法向量n和紋理映射f,從而對于任意需要渲染的像素點(diǎn),都有一組歸一化的輸入向量[x,s,v,n,f],通過擬合函數(shù)即可得到該像素點(diǎn)的R、G、B顏色分量,即間接光照值。
將每個(gè)場景點(diǎn)的直接光照和間接光照進(jìn)行疊加,得到最終的渲染圖像。
通過使用Mitsuba進(jìn)行離線渲染,獲取訓(xùn)練數(shù)據(jù)。使用Matlab對神經(jīng)網(wǎng)絡(luò)進(jìn)行訓(xùn)練。再用訓(xùn)練好的網(wǎng)絡(luò)對輸入數(shù)據(jù)進(jìn)行擬合,得到輸出的圖像。實(shí)驗(yàn)平臺為: i5處理器、3.3GHz主頻、8G內(nèi)存、2G顯存。
本文采用了隨機(jī)采樣和基于高斯分布的采樣兩種方式選取樣本點(diǎn),兩種采樣方式在神經(jīng)網(wǎng)絡(luò)的訓(xùn)練時(shí)間、收斂速度和渲染精度方面均無明顯差別。
針對同一場景,由于同一面的單位法向量相同等原因,所以在最終獲取到的訓(xùn)練數(shù)據(jù)中,存在大量冗余數(shù)據(jù)。在訓(xùn)練前,先將這一部分冗余數(shù)據(jù)剔除。
分別用BP網(wǎng)絡(luò)和RBF網(wǎng)絡(luò)進(jìn)行了求解,對于Smallpt場景,擬合的間接光照效果如圖2所示。
圖2 間接光照擬合效果
RBF網(wǎng)絡(luò)擬合的間接光照與直接光照疊加,得到最終渲染圖像,效果如圖3所示。
圖3 離線渲染效果和本文方法效果
在不同的視點(diǎn)位置下渲染結(jié)果如圖4所示。
圖4 不同視點(diǎn)位置下的渲染效果
圖5是 Sponza場景在不同規(guī)模訓(xùn)練數(shù)據(jù)下的渲染效果。
圖5 Sponza場景不同規(guī)模訓(xùn)練數(shù)據(jù)下的渲染效果
實(shí)驗(yàn)發(fā)現(xiàn),但當(dāng)訓(xùn)練數(shù)據(jù)達(dá)到一定規(guī)模時(shí),單次訓(xùn)練時(shí)間不斷增加,網(wǎng)絡(luò)收斂速度越來越慢,錯(cuò)誤率下降越來越慢。實(shí)驗(yàn)還發(fā)現(xiàn),最終的訓(xùn)練時(shí)間與場景大小和離線渲染的訓(xùn)練數(shù)據(jù)大小無關(guān),而與有效的向量數(shù)量有關(guān),以兩個(gè)不同大小的場景Smallpt和Sponza為例,兩者場景大小相差很大,離線渲染得到的訓(xùn)練數(shù)據(jù)量相差也很大,但是有效向量數(shù)量接近,因而其最終的訓(xùn)練消耗時(shí)間也類似。由于都是較小規(guī)模場景,在相同擬合誤差要求下,RBF相對BP網(wǎng)絡(luò)能更快收斂,其效果好于BP。具體比較見表1。
采用RBF神經(jīng)網(wǎng)絡(luò)擬合的方法來實(shí)現(xiàn)間接光照,可以避免在傳統(tǒng)的光照模型中光線多次求交的問題,實(shí)現(xiàn)全局光照的實(shí)時(shí)繪制。雖然由于RBF網(wǎng)絡(luò)本身的局限性,在對較為復(fù)雜的場景渲染時(shí),輸入空間增大,泛化能力下降,訓(xùn)練時(shí)間增加。但較之前使用BP網(wǎng)絡(luò)的擬合方法,不易陷入局部極值,有更快的收斂速度和更好的擬合效果。
在后續(xù)工作中,考慮使用多個(gè)網(wǎng)絡(luò)并行對場景中不同的特征值進(jìn)行處理,以應(yīng)對更加復(fù)雜的場景和動(dòng)態(tài)場景。
表1 不同場景比較