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