程雯靚
(四川大學(xué)計(jì)算機(jī)學(xué)院,成都610065)
近年來(lái),計(jì)算機(jī)圖形學(xué)被廣泛應(yīng)用于電子游戲、虛擬現(xiàn)實(shí)、動(dòng)畫(huà)和電影等領(lǐng)域。隨著渲染技術(shù)及硬件的發(fā)展,人們對(duì)渲染畫(huà)面的真實(shí)感有了更高的追求。渲染畫(huà)面的真實(shí)感與符合現(xiàn)實(shí)世界的物理規(guī)律的渲染技術(shù)緊密相關(guān),例如基于光線跟蹤的全局光照算法等。在為現(xiàn)實(shí)世界的物理規(guī)律建模的幾項(xiàng)要素中,可見(jiàn)性代表了模型幾何表面之間的遮擋關(guān)系,它使渲染畫(huà)面具備立體感,是渲染畫(huà)面具備真實(shí)感中不可或缺的一項(xiàng)。然而,可見(jiàn)性與方向相關(guān),每個(gè)著色點(diǎn)的可見(jiàn)性需要在其以法線為中心的半球(下文稱為法線半球)的各個(gè)方向上進(jìn)行成百上千次的采樣并判斷該方向是否可見(jiàn),具有較大的計(jì)算量。
在動(dòng)畫(huà)、電影等離線渲染領(lǐng)域,其主要目標(biāo)是為觀眾呈現(xiàn)生動(dòng)逼真的畫(huà)面,對(duì)渲染時(shí)間沒(méi)有要求,因此它們更多地使用基于物理的渲染技術(shù),其中的可見(jiàn)性也能被正確計(jì)算;而在電子游戲、虛擬現(xiàn)實(shí)等領(lǐng)域,不僅追求渲染畫(huà)面的真實(shí)感,也對(duì)其實(shí)時(shí)性有著很高的要求。因?yàn)樵谶@些應(yīng)用中,渲染畫(huà)面只是其中的一部分,游戲邏輯判斷、運(yùn)動(dòng)物體的物理碰撞檢測(cè)等也包含其中,而這些需要在很短的時(shí)間內(nèi)完成,才能帶給玩家流暢的游戲體驗(yàn)。因此,這類應(yīng)用通常會(huì)采用近似符合物理規(guī)律或基于預(yù)計(jì)算的渲染技術(shù),以保證渲染畫(huà)面的真實(shí)感及實(shí)時(shí)性。其中,可見(jiàn)性由于其計(jì)算量較大,難以實(shí)時(shí)計(jì)算;并且,可見(jiàn)性與方向相關(guān),每個(gè)著色點(diǎn)的可見(jiàn)性大不相同,如果存儲(chǔ)可見(jiàn)性信息,將會(huì)占據(jù)非常大的存儲(chǔ)空間。因此,可見(jiàn)性在光照計(jì)算中常被省略,導(dǎo)致最終的光照效果比較平坦、缺乏立體感。這時(shí)候通常采取近似可見(jiàn)性的技術(shù)進(jìn)行彌補(bǔ),且通常在屏幕空間實(shí)現(xiàn),以增加畫(huà)面的立體感,例如基于屏幕空間的環(huán)境遮擋[1](Screen Space Ambient Occlusion,SSAO)等算法。
然而,在某些情況下,渲染技術(shù)需要使用更加精準(zhǔn)的可見(jiàn)性判斷?;诠庹仗结樀娜止庹账惴╗2]是一種基于預(yù)計(jì)算的全局光照算法[3],常被應(yīng)用于電子游戲、虛擬現(xiàn)實(shí)等對(duì)實(shí)時(shí)性要求較高的領(lǐng)域和計(jì)算性能較低的移動(dòng)端中。在基于光照探針的全局光照算法中,光照探針稀疏地分布在場(chǎng)景中,光照探針呈球狀,每個(gè)光照探針捕捉了球面各個(gè)方向的光照信息。渲染時(shí),每個(gè)著色點(diǎn)的光照信息由其周圍的幾個(gè)光照探針提供(本文稱為局部光照信息)。如環(huán)境遮蔽等近似可見(jiàn)性的算法由于缺乏方向性信息,對(duì)渲染畫(huà)面的立體感提升不強(qiáng),此時(shí),物體的三維表面上需要更加精準(zhǔn)的可見(jiàn)性。而精準(zhǔn)的可見(jiàn)性需要在每個(gè)著色點(diǎn)的法線半球的各個(gè)方向上進(jìn)行判斷,具有較大的計(jì)算量,難以實(shí)時(shí)計(jì)算。
本文基于預(yù)計(jì)算的思想,利用球諧函數(shù)[4]作為球面基函數(shù)離線預(yù)計(jì)算三維模型表面的可見(jiàn)性分布;為了進(jìn)一步壓縮存儲(chǔ)量,構(gòu)造誤差函數(shù),利用最小二乘擬合將球諧函數(shù)表達(dá)的可見(jiàn)性分布進(jìn)一步壓縮為可見(jiàn)性圓錐;實(shí)現(xiàn)了一種高精度、低存儲(chǔ)量的可見(jiàn)性算法。
給定三維模型表面上的一個(gè)點(diǎn)x,其可見(jiàn)性是一個(gè)定義在點(diǎn)x的法線半球上的方向分布函數(shù)。球諧函數(shù)是定義在單位球面的標(biāo)準(zhǔn)正交的基函數(shù),它忽略半徑大小,僅考慮球面的方向變化,常用于表達(dá)球面上的方向分布函數(shù)。因此,本文采用球諧函數(shù)擬合可見(jiàn)性分布,將其投影到球諧函數(shù)的n個(gè)基函數(shù)的線性組合,并存儲(chǔ)為n個(gè)基函數(shù)的系數(shù)(權(quán)重);接著,為了進(jìn)一步壓縮存儲(chǔ)量,本文采用可見(jiàn)性圓錐作為最終存儲(chǔ)可見(jiàn)性的數(shù)據(jù)結(jié)構(gòu),可見(jiàn)性圓錐包含主可見(jiàn)方向、可見(jiàn)角度、可見(jiàn)性放縮因子,對(duì)可見(jiàn)性分布具有靈活地表達(dá)。壓縮方式是:通過(guò)構(gòu)造誤差函數(shù),利用最小二乘擬合[5]求解(局部)最優(yōu)解,將球諧函數(shù)表達(dá)的可見(jiàn)性分布?jí)嚎s為一個(gè)可見(jiàn)性圓錐。
本節(jié)主要描述算法的具體細(xì)節(jié)。首先對(duì)球諧函數(shù)進(jìn)行概述;接著,描述如何將一個(gè)點(diǎn)在其法線半球上的可見(jiàn)性分布投影為球諧函數(shù);然后,描述如何構(gòu)建誤差函數(shù),將球諧函數(shù)表達(dá)的可見(jiàn)性分布?jí)嚎s為可見(jiàn)性圓錐;最后,簡(jiǎn)單介紹本文在判斷可見(jiàn)時(shí)使用的遮擋距離加權(quán)方式。
(1)球諧函數(shù)
球諧函數(shù)的定義如公式(1)所示,其中,l表示當(dāng)前基函數(shù)的帶(band,也稱為階數(shù),下文統(tǒng)一用階數(shù)表示),m表示在第l階中第m個(gè)基函數(shù)(m∈[-l,l]),表示相應(yīng)的勒讓德多項(xiàng)式表示規(guī)則化的縮放系數(shù),其計(jì)算方式如公式(2)所示。參數(shù)l將球諧函數(shù)分成不同階,每個(gè)階數(shù)內(nèi)包含2l+1個(gè)基函數(shù),它們具備相同的多項(xiàng)式次數(shù)。前n階包括n2個(gè)基函數(shù),對(duì)原始函數(shù)的n階近似則需要存儲(chǔ)n2個(gè)系數(shù)。
將一個(gè)球面函數(shù)投影為球諧函數(shù)系數(shù)的過(guò)程稱為投影,計(jì)算系數(shù)即對(duì)原函數(shù)和球諧函數(shù)的基函數(shù)進(jìn)行積分,如公式(3);反之,將球諧函數(shù)按對(duì)應(yīng)的系數(shù)進(jìn)行線性組合,重建對(duì)原函數(shù)的近似稱為重建,如公式(4)。
(2)可見(jiàn)性投影到球諧函數(shù)
本文采用4階球諧函數(shù)(16個(gè)基函數(shù))來(lái)近似可見(jiàn)性分布。其基本思路是:對(duì)于三維模型表面上任意一個(gè)點(diǎn)x,首先在其法線半球上均勻采樣,并判斷各個(gè)方向可見(jiàn)或是被遮擋,接著將每個(gè)采樣方向投影到球諧函數(shù)上,累計(jì)該采樣方向?qū)ο禂?shù)的貢獻(xiàn),最終得到16個(gè)系數(shù)。由于本文是離線計(jì)算,故直接采用遍歷的方式來(lái)得到球面上呈均勻分布的各個(gè)方向,以確保球面各個(gè)方向都有采樣值,而沒(méi)有采取均勻分布生成隨機(jī)數(shù)的計(jì)算方式。采用球面均勻采樣的原因是:每個(gè)采樣方向的權(quán)重都相同,計(jì)算其對(duì)最終系數(shù)的貢獻(xiàn)十分簡(jiǎn)單準(zhǔn)確。
(3)可見(jiàn)性圓錐
可見(jiàn)性圓錐由主要可見(jiàn)方向、可見(jiàn)角度和可見(jiàn)性放縮因子構(gòu)成。主要可見(jiàn)方向的定義類似Bent Nor?mal;可見(jiàn)角度定義了主要可見(jiàn)范圍;可見(jiàn)性放縮因子為可見(jiàn)性圓錐的大小,其范圍在0~1之間,當(dāng)一個(gè)點(diǎn)被多個(gè)方向遮擋時(shí),可以將可見(jiàn)性放縮因子設(shè)置得小一點(diǎn),更加靈活地表達(dá)可見(jiàn)性分布。將可見(jiàn)性分布?jí)嚎s為可見(jiàn)性圓錐的過(guò)程就是求解可見(jiàn)性圓錐的三個(gè)元素,主要可見(jiàn)方向可以直接由球諧函數(shù)的optimal linear方向得到,剩余的就是求解可見(jiàn)角度α和可見(jiàn)性放縮因子S。利用最小二乘擬合的推導(dǎo)過(guò)程如下:
首先將可見(jiàn)性圓錐用球諧函數(shù)的表示方式(公式(5)),并構(gòu)造誤差函數(shù)(公式(6))。
接著,誤差函數(shù)分別對(duì)α和S求導(dǎo),并將導(dǎo)數(shù)置為0,求解可得到最優(yōu)解(公式(7))。但這一步的難度在于這個(gè)導(dǎo)數(shù)定義在半球面,難以直接求解。
借助球諧函數(shù)的標(biāo)準(zhǔn)正交性,有式(8)成立,即兩個(gè)球諧函數(shù)的積分可以轉(zhuǎn)化為其系數(shù)的點(diǎn)乘。從而可以對(duì)式(7)中進(jìn)行化簡(jiǎn),得到式(9)。
最后,對(duì)式(9)利用最小二乘擬合即可求解出α和S的最優(yōu)解,最終就將由16個(gè)浮點(diǎn)數(shù)表示的可見(jiàn)性分布函數(shù)壓縮成了可見(jiàn)性圓錐??梢?jiàn)性圓錐包含5個(gè)浮點(diǎn)數(shù),將主要可見(jiàn)方向保存在切線空間后可以進(jìn)一步壓縮成4個(gè)浮點(diǎn)數(shù)進(jìn)行存儲(chǔ)。
(4)遮擋距離加權(quán)
前文提及,某個(gè)方向的可見(jiàn)性判斷是一個(gè)布爾值,即可見(jiàn)或被遮擋。然而,由于球面上的方向分布本質(zhì)是一個(gè)連續(xù)函數(shù),而在球面上進(jìn)行采樣的思路是對(duì)其離散化進(jìn)行近似,只有當(dāng)采樣次數(shù)達(dá)到極高時(shí)才能完全擬合球面的分布函數(shù)。但在實(shí)際應(yīng)用中,我們?cè)谇蛎娴牟蓸哟螖?shù)有限,一個(gè)立體角內(nèi)僅有一個(gè)采樣方向。為了對(duì)這一矛盾進(jìn)行彌補(bǔ),本文采用對(duì)遮擋距離進(jìn)行加權(quán)。即:對(duì)于一個(gè)立體角來(lái)說(shuō),該采樣方向遮擋距離遠(yuǎn),那么該立體角內(nèi)所有方向被遮擋的概率就更低;反之,若遮擋距離近,則表明該立體角內(nèi)所有方向被遮擋的概率更高。本文采用公式(10)的方式計(jì)算權(quán)重,其中docc是指被遮擋的距離,dmax是指模型的對(duì)角線長(zhǎng)度。
實(shí)驗(yàn)一:驗(yàn)證可見(jiàn)性圓錐的正確性。
通過(guò)在可視化模型上可見(jiàn)性圓錐的三個(gè)元素,驗(yàn)證可見(jiàn)性圓錐的正確性??梢?jiàn)性圓錐可視化預(yù)期結(jié)果是:主可見(jiàn)方向在模型未遮擋的地方與法線一致、存在遮擋的地方會(huì)在兩個(gè)面片之間平滑過(guò)渡;可見(jiàn)角度在未被大面積遮擋的地方角度更大,可視化結(jié)果接近白色、相互遮擋之處較小,可視化結(jié)果接近黑色;而在非常狹窄的地方,可見(jiàn)性縮放因子較小,可見(jiàn)角度較大。
在模型上可視化可見(jiàn)性圓錐的結(jié)果如圖1所示,符合上述預(yù)期特點(diǎn),因此可見(jiàn)性圓錐計(jì)算基本正確。實(shí)驗(yàn)二:驗(yàn)證遮擋距離加權(quán)的正確性。
圖1 可見(jiàn)性圓錐
本實(shí)驗(yàn)的目的是驗(yàn)證遮擋距離加權(quán)的正確性,預(yù)期目標(biāo)是遮擋距離加權(quán)后三維模型表面上的可見(jiàn)性的分布更加準(zhǔn)確和平滑。本實(shí)驗(yàn)選擇表面更加復(fù)雜的汽車模型,實(shí)驗(yàn)結(jié)果如圖2所示,可以發(fā)現(xiàn),對(duì)遮擋距離進(jìn)行加權(quán)后,可以得到更加平滑、自然的可見(jiàn)性分布。
本文提出基于預(yù)計(jì)算的思想,以球諧函數(shù)作為球面基函數(shù)表達(dá)三維模型表面的可見(jiàn)性分布,并進(jìn)一步將其壓縮為可見(jiàn)性圓錐,得到了一種高精度、低存儲(chǔ)量的預(yù)計(jì)算可見(jiàn)性。該算法可用于解決其他光照算法中可見(jiàn)性缺失所造成的光照結(jié)果平坦、缺乏立體感的問(wèn)題,具有一定的實(shí)際意義。
圖2 遮擋距離加權(quán)對(duì)比實(shí)驗(yàn)