喻光繼,羅偉泰,吳肖云
(1.廣西財經學院信息與統計學院,南寧530003; 2.廣西自然資源職業技術學院公共基礎部,南寧530100)
(?通信作者電子郵箱luoweitai@126.com)
計算機技術的發展,使得虛擬現實技術的應用越來越深入,而全局光照是虛擬世界真實感的重要組成[1],但由于對于大規模復雜場景的全局光照計算,計算量和資源占用難以滿足實時性要求[2],因此,需要有效的存儲結構和計算方法來優化全局光照在大規模場景中的計算[3]。
光線追蹤[4]和體素錐結構[5]是常用的全局光照計算方法,其通常采用八叉樹等結構加速存儲計算:薛俊杰等[6]采用多級小波分解及多級系數編碼,增加細節信息,實現多分辨率渲染;Blumensath等[7]提出稀疏體素與八叉樹索引相結合的信息存儲結構,提高了間接光照的計算效率,但存儲空間需求較大;Wang等[8]優化了稀疏體素八叉樹,但節點編碼仍占用較多資源;K?mpe等[9]采用稀疏體素有向無環圖(Sparse Voxel Directed Acyclic Graph,SVDAG)結構減少冗余共享節點的存儲;袁昱緯等[10]以幀間復用對SVDAG結構進行改進,以避開重復合并;郭向坤等[11]采用 CPU(Central Processing Unit)與GPU(Graphics Processing Unit)協同的并行掃描線優化大規模場景體素化。
體素錐追蹤在復雜光照計算時取得較好效果[6-10],但八叉樹及改進結構[7]在大規模實時渲染時,體素數隨場景規模而劇增,且由于結構不具有各向異性,遍歷查找困難耗時[12-13],為此,針對大規模復雜場景提出基于改進體素錐濾波器追蹤的全局光照計算算法,以級聯紋理結構優化信息存儲,基于法線加權累積計算光照衰減,基于級聯紋理結構改進錐波濾器以優化體素的動態計算查找。
本文采用級聯體素紋理結構表達場景,代替原有的三角形表達,該結構依據人眼的距離敏感性,將場景劃分為互嵌套的距離圖元網格[14]。區域離人眼越近,其網格越小以便高分辨率地精細描述景物,網格以相互嵌套正方體形狀,沿視角方向延展,其三層網絡示意圖如圖1所示,文中取n=6。
級聯結構中的基本紋素與體素對應,為保護結構各向異性存儲體素的6個面信息,從而以合理的方式由近及遠將場景覆蓋,體素的各向異性保證了光照計算的準確性,且有利于體素間的三線性插值和硬件加速查找。
直接光照的計算及其分布通常與光線的傳輸方程相關,物體p點的光線傳輸方程為:

式中:Ω為p點所處半球空間,ω0、ωi為光線出射和入射角;L0、Le、Li分別為出射、發射和入射的輻射照度;f為雙向反射函數(Bidirectional Reflection Distribution Function,BRDF),cosθi=n?ωi為入射光在p點的法線n的衰減,ωi為光線方向矢量。
直接光照計算時采用體素多三角形面片法向均值計算cosθi,某些體素會因法線反向而無法正確接收光照,為此,提出基于法線加權累積的光照衰減計算方法,即:

式中:k為三角形面片的數目,n j為各面片的法線,V為法線衰減值,ns、Ls為坐標軸分量。
為保持光線追蹤時采樣的一致性,需建立各向異性的輻射體層級。如圖2所示為三維紋理生成貼圖的過程,在體素劃分的基礎上,對各坐標軸求和并計算均值;采樣時根據光照入射角插值計算其輻射值。每次入射輻射度收集后都需各向異性過濾,本文對直接和間接光照都進行了入射輻射度收集和各向異性過濾。

圖2 各向異性過濾與采樣Fig.2 Anisotropic filteringand sampling
間接光照需要計算半球內的所有積分,計算量巨大,為此,提出基于級聯紋理的改進錐濾波器追蹤算法。在光照采集時,以級聯體素的法向量均值作為起始點,定義k個錐波濾器,漫反射模擬為60o光圈值的6個錐體,而高光反射模擬為10o光圈值的單椎體。
改進錐濾波器依次排列樣本模塊,并與級聯等級對應,如圖3(a)所示,各模塊到錐頂點p的距離l與角度β確定了當前采樣模塊的直徑r,再結合體素寬度Ws,則可計算得到體素所處的級聯等級d:


圖3 錐濾波器與級聯紋理Fig.3 Conefilter and cascadingtexture
由d、r及角度β可自行計算體素位置,避免對整個存儲結構的遍歷。每個錐波濾器計算采樣值后,由k=6個錐累積值作為當前體素的光亮值。
在第m步中,錐濾波器需要動態更新輻射度cm及相應的累積遮蔽值am,即:

式中:hc為存儲輻射度,ha為存儲遮蔽值。直接光照注入后,將各錐濾波器的結果加權乘以反射率,再加上直接光照值,即得到體素的最終光亮度。
實驗選取康奈爾靜態場景[13]和 Sponza、Sibenic 以及Cathedral[14]動態場景,從規模、速度和內存消耗等方面對文中算法性能進行測試,環境為:Intel Xeon E5-2643 v4 3.4 GHz,32 GB內存,NVIDIA M4000 8 GB顯存。
為驗證級聯體素紋理結構存儲的優勢,以三維紋理[2]、稀疏八叉樹[8]、基于 Morton碼的稀疏八叉樹(Morton-based Sparse Voxel Octree,MSVO)結構[5]和 SVDAG 結構[10]作為實驗比較算法,從體素規模、運行時間及內存消耗3個方面測試對比,實驗結果如圖4所示。

圖4 各算法的體素結構性能比較結果Fig.4 Voxel structureperformancecomparison of different algorithms
從圖4(a)實驗結果可以看出,三維紋理結構在各場景下的體素規模都最大,而稀疏八叉樹、MSVO、SVDAG的體素規模有明顯減少,但仍遠高于文中級聯結構。不同分辨率下的實驗結果進一步分析可知,低分辨率時,稀疏八叉樹的體素規模與文中結構相差不大;但隨著分辨率的增加,規模差異隨之增大,主要因為級聯紋理按層次劃分存儲,相鄰層呈倍數遞增,小規模場景的分層優勢不明顯,但在高分辨率下僅需增加層數。
從圖4(b)結果可以發現,稀疏八叉樹及MSVO結構的復雜邏輯不利于快速數據遍歷,而級聯紋理的分層存儲在減小體素規模的同時,更利于數據的遍歷和查找,因而極大縮短體素化運行時間。
在內存消耗方面,以像素透明屬性作為實驗比較統計量,實驗結果如圖4(c)所示,可以看出,文中結構的6個面信息存儲仍具有明顯的內存占用優勢,且隨著分辨率的增加,內存占用呈線性增加。
由于間接光照具有更大的渲染難度,為此,以間接光照的渲染效果來比較本文算法與MSVO算法[14]、稀體素錐追蹤算法[5]及光驅動體素法[11]四種算法的渲染效果,實驗結果如圖5所示。

圖5 不同算法間接光照渲染效果Fig.5 Indirect illumination renderingeffects of different algorithms
從結果可以看出,光驅動體素法采用體素分散結構與錐追蹤融合計算間接光照,可以看出,其渲染的間接光照較柔和,但遠區域細節較差,體素錐追蹤算法與文中算法的渲染效果與真實場景視覺質量相近,對遠區域細節也能夠較好地表達,說明文中算法遠視域大體積體素渲染,獲得與體素錐追蹤算法相似的渲染效果。
綜合整體實驗結果,所提算法在取得較好的渲染效果基礎上,極大地降低了體素化規模和內存消耗,縮短了渲染運行時間,有利于大規模復雜場景全局光照的實時繪制。
計算機性能的提高使得虛擬現實在軍事、教育、娛樂等領域的應用越來越深入,而全局光照的計算和渲染是真實感增強及場景分析等虛擬現實技術的重要組成部分。本文提出一種基于改進體素錐濾波器追蹤的全局光照計算算法,算法通過級聯紋理結構快速光照信息存儲、法線加權累積光照衰減計算和體素動態遍歷計算,實現全局光照的高效渲染計算,并避免法線反向問題。實驗結果表明,改進算法在降低內存占用、提高渲染速度的同時,保持與經典稀疏體素追蹤算法相近的渲染效果。