程雯靚
(四川大學計算機學院,成都610065)
近年來,計算機圖形學被廣泛應用于電子游戲、虛擬現實、動畫和電影等領域。隨著渲染技術及硬件的發展,人們對渲染畫面的真實感有了更高的追求。渲染畫面的真實感與符合現實世界的物理規律的渲染技術緊密相關,例如基于光線跟蹤的全局光照算法等。在為現實世界的物理規律建模的幾項要素中,可見性代表了模型幾何表面之間的遮擋關系,它使渲染畫面具備立體感,是渲染畫面具備真實感中不可或缺的一項。然而,可見性與方向相關,每個著色點的可見性需要在其以法線為中心的半球(下文稱為法線半球)的各個方向上進行成百上千次的采樣并判斷該方向是否可見,具有較大的計算量。
在動畫、電影等離線渲染領域,其主要目標是為觀眾呈現生動逼真的畫面,對渲染時間沒有要求,因此它們更多地使用基于物理的渲染技術,其中的可見性也能被正確計算;而在電子游戲、虛擬現實等領域,不僅追求渲染畫面的真實感,也對其實時性有著很高的要求。因為在這些應用中,渲染畫面只是其中的一部分,游戲邏輯判斷、運動物體的物理碰撞檢測等也包含其中,而這些需要在很短的時間內完成,才能帶給玩家流暢的游戲體驗。因此,這類應用通常會采用近似符合物理規律或基于預計算的渲染技術,以保證渲染畫面的真實感及實時性。其中,可見性由于其計算量較大,難以實時計算;并且,可見性與方向相關,每個著色點的可見性大不相同,如果存儲可見性信息,將會占據非常大的存儲空間。因此,可見性在光照計算中常被省略,導致最終的光照效果比較平坦、缺乏立體感。這時候通常采取近似可見性的技術進行彌補,且通常在屏幕空間實現,以增加畫面的立體感,例如基于屏幕空間的環境遮擋[1](Screen Space Ambient Occlusion,SSAO)等算法。
然而,在某些情況下,渲染技術需要使用更加精準的可見性判斷。基于光照探針的全局光照算法[2]是一種基于預計算的全局光照算法[3],常被應用于電子游戲、虛擬現實等對實時性要求較高的領域和計算性能較低的移動端中。在基于光照探針的全局光照算法中,光照探針稀疏地分布在場景中,光照探針呈球狀,每個光照探針捕捉了球面各個方向的光照信息。渲染時,每個著色點的光照信息由其周圍的幾個光照探針提供(本文稱為局部光照信息)。如環境遮蔽等近似可見性的算法由于缺乏方向性信息,對渲染畫面的立體感提升不強,此時,物體的三維表面上需要更加精準的可見性。而精準的可見性需要在每個著色點的法線半球的各個方向上進行判斷,具有較大的計算量,難以實時計算。
本文基于預計算的思想,利用球諧函數[4]作為球面基函數離線預計算三維模型表面的可見性分布;為了進一步壓縮存儲量,構造誤差函數,利用最小二乘擬合將球諧函數表達的可見性分布進一步壓縮為可見性圓錐;實現了一種高精度、低存儲量的可見性算法。
給定三維模型表面上的一個點x,其可見性是一個定義在點x的法線半球上的方向分布函數。球諧函數是定義在單位球面的標準正交的基函數,它忽略半徑大小,僅考慮球面的方向變化,常用于表達球面上的方向分布函數。因此,本文采用球諧函數擬合可見性分布,將其投影到球諧函數的n個基函數的線性組合,并存儲為n個基函數的系數(權重);接著,為了進一步壓縮存儲量,本文采用可見性圓錐作為最終存儲可見性的數據結構,可見性圓錐包含主可見方向、可見角度、可見性放縮因子,對可見性分布具有靈活地表達。壓縮方式是:通過構造誤差函數,利用最小二乘擬合[5]求解(局部)最優解,將球諧函數表達的可見性分布壓縮為一個可見性圓錐。
本節主要描述算法的具體細節。首先對球諧函數進行概述;接著,描述如何將一個點在其法線半球上的可見性分布投影為球諧函數;然后,描述如何構建誤差函數,將球諧函數表達的可見性分布壓縮為可見性圓錐;最后,簡單介紹本文在判斷可見時使用的遮擋距離加權方式。
(1)球諧函數
球諧函數的定義如公式(1)所示,其中,l表示當前基函數的帶(band,也稱為階數,下文統一用階數表示),m表示在第l階中第m個基函數(m∈[-l,l]),表示相應的勒讓德多項式表示規則化的縮放系數,其計算方式如公式(2)所示。參數l將球諧函數分成不同階,每個階數內包含2l+1個基函數,它們具備相同的多項式次數。前n階包括n2個基函數,對原始函數的n階近似則需要存儲n2個系數。
將一個球面函數投影為球諧函數系數的過程稱為投影,計算系數即對原函數和球諧函數的基函數進行積分,如公式(3);反之,將球諧函數按對應的系數進行線性組合,重建對原函數的近似稱為重建,如公式(4)。


(2)可見性投影到球諧函數
本文采用4階球諧函數(16個基函數)來近似可見性分布。其基本思路是:對于三維模型表面上任意一個點x,首先在其法線半球上均勻采樣,并判斷各個方向可見或是被遮擋,接著將每個采樣方向投影到球諧函數上,累計該采樣方向對系數的貢獻,最終得到16個系數。由于本文是離線計算,故直接采用遍歷的方式來得到球面上呈均勻分布的各個方向,以確保球面各個方向都有采樣值,而沒有采取均勻分布生成隨機數的計算方式。采用球面均勻采樣的原因是:每個采樣方向的權重都相同,計算其對最終系數的貢獻十分簡單準確。
(3)可見性圓錐
可見性圓錐由主要可見方向、可見角度和可見性放縮因子構成。主要可見方向的定義類似Bent Nor?mal;可見角度定義了主要可見范圍;可見性放縮因子為可見性圓錐的大小,其范圍在0~1之間,當一個點被多個方向遮擋時,可以將可見性放縮因子設置得小一點,更加靈活地表達可見性分布。將可見性分布壓縮為可見性圓錐的過程就是求解可見性圓錐的三個元素,主要可見方向可以直接由球諧函數的optimal linear方向得到,剩余的就是求解可見角度α和可見性放縮因子S。利用最小二乘擬合的推導過程如下:
首先將可見性圓錐用球諧函數的表示方式(公式(5)),并構造誤差函數(公式(6))。

接著,誤差函數分別對α和S求導,并將導數置為0,求解可得到最優解(公式(7))。但這一步的難度在于這個導數定義在半球面,難以直接求解。

借助球諧函數的標準正交性,有式(8)成立,即兩個球諧函數的積分可以轉化為其系數的點乘。從而可以對式(7)中進行化簡,得到式(9)。

最后,對式(9)利用最小二乘擬合即可求解出α和S的最優解,最終就將由16個浮點數表示的可見性分布函數壓縮成了可見性圓錐。可見性圓錐包含5個浮點數,將主要可見方向保存在切線空間后可以進一步壓縮成4個浮點數進行存儲。
(4)遮擋距離加權
前文提及,某個方向的可見性判斷是一個布爾值,即可見或被遮擋。然而,由于球面上的方向分布本質是一個連續函數,而在球面上進行采樣的思路是對其離散化進行近似,只有當采樣次數達到極高時才能完全擬合球面的分布函數。但在實際應用中,我們在球面的采樣次數有限,一個立體角內僅有一個采樣方向。為了對這一矛盾進行彌補,本文采用對遮擋距離進行加權。即:對于一個立體角來說,該采樣方向遮擋距離遠,那么該立體角內所有方向被遮擋的概率就更低;反之,若遮擋距離近,則表明該立體角內所有方向被遮擋的概率更高。本文采用公式(10)的方式計算權重,其中docc是指被遮擋的距離,dmax是指模型的對角線長度。

實驗一:驗證可見性圓錐的正確性。
通過在可視化模型上可見性圓錐的三個元素,驗證可見性圓錐的正確性。可見性圓錐可視化預期結果是:主可見方向在模型未遮擋的地方與法線一致、存在遮擋的地方會在兩個面片之間平滑過渡;可見角度在未被大面積遮擋的地方角度更大,可視化結果接近白色、相互遮擋之處較小,可視化結果接近黑色;而在非常狹窄的地方,可見性縮放因子較小,可見角度較大。
在模型上可視化可見性圓錐的結果如圖1所示,符合上述預期特點,因此可見性圓錐計算基本正確。實驗二:驗證遮擋距離加權的正確性。

圖1 可見性圓錐
本實驗的目的是驗證遮擋距離加權的正確性,預期目標是遮擋距離加權后三維模型表面上的可見性的分布更加準確和平滑。本實驗選擇表面更加復雜的汽車模型,實驗結果如圖2所示,可以發現,對遮擋距離進行加權后,可以得到更加平滑、自然的可見性分布。
本文提出基于預計算的思想,以球諧函數作為球面基函數表達三維模型表面的可見性分布,并進一步將其壓縮為可見性圓錐,得到了一種高精度、低存儲量的預計算可見性。該算法可用于解決其他光照算法中可見性缺失所造成的光照結果平坦、缺乏立體感的問題,具有一定的實際意義。

圖2 遮擋距離加權對比實驗