曹家樂, 馮月萍
(吉林大學(xué) 計算機(jī)科學(xué)與技術(shù)學(xué)院, 長春 130012)
陰影是一種常見的光照現(xiàn)象, 通常是指由于光沿直線傳播被不透明物體阻擋而產(chǎn)生的黑暗區(qū)域. 陰影的渲染能顯著增強(qiáng)虛擬現(xiàn)實場景的真實感[1-6].
目前已有多種陰影渲染算法, 這些算法主要分為三類, 即全局光照算法、 陰影映射算法和陰影體算法[7-11]. 其中以光線追蹤為代表的全局光照算法雖然效果逼真, 但計算量巨大, 很難進(jìn)行實時繪制[12-13]. 陰影映射算法和陰影體算法可視為全局光照方法的近似方法. 陰影體算法由于對場景中的物體幾何復(fù)雜程度有嚴(yán)重的依賴, 且對場景中物體形狀的構(gòu)成有嚴(yán)格限制, 因此適用性較差. 而陰影映射算法[14]對場景復(fù)雜度幾乎沒有任何限制, 并且原理簡單, 繪制速度快, 已逐漸成為該領(lǐng)域的研究熱點(diǎn). 研究表明, 在深度紋理中儲存除深度外的更多信息可有效提升陰影渲染的質(zhì)量[15], 并且通過濾波技術(shù)過濾陰影的邊緣, 可得到軟陰影效果[16-18]. 文獻(xiàn)[19]改善了陰影映射算法存在的誤差問題.
傳統(tǒng)陰影映射算法在每幀中均對場景中的所有物體進(jìn)行兩遍繪制, 第一遍繪制計算場景中物體的深度并生成一張深度紋理, 第二遍繪制渲染場景并計算陰影. 但在一個復(fù)雜場景中, 有些物體是靜止的, 靜止物體的深度信息不變, 所以并不需要在每幀的第一遍繪制中都計算其深度. 基于該思想, 本文提出將傳統(tǒng)算法中的一張深度紋理分成動態(tài)深度紋理和靜態(tài)深度紋理兩張深度紋理. 實時監(jiān)測場景中各物體的運(yùn)動狀態(tài), 動態(tài)深度紋理記錄場景中運(yùn)動物體的深度信息, 靜態(tài)深度紋理記錄靜止物體的深度信息, 在算法的第一遍繪制中只需更新動態(tài)深度紋理的深度信息, 不需重新計算靜態(tài)深度紋理的信息, 在算法的第二遍繪制中通過動態(tài)深度紋理和靜態(tài)深度紋理共同計算陰影. 實驗結(jié)果表明, 該方法相比于傳統(tǒng)陰影映射算法, 減少了深度信息的計算, 提高了算法的運(yùn)行效率.
陰影映射算法[10]是實時渲染領(lǐng)域最常用的陰影渲染算法, 其基本原理是以光源為視點(diǎn)可看到場景中所有被照亮的部分, 而光源看不到的區(qū)域則是陰影區(qū)域. 該方法主要分為兩步:
1) 以光源位置為視點(diǎn)對整個場景進(jìn)行繪制. 記錄場景中每個可見像素的深度, 這些深度信息代表了某像素上距離光源最近物體與光源之間的距離. 將這些深度信息儲存后構(gòu)成深度紋理.
圖1 傳統(tǒng)陰影映射算法原理Fig.1 Principle of traditional shadow mapping algorithm
2) 從真實視點(diǎn)的角度繪制場景, 原理如圖1所示. 對于繪制的每個點(diǎn), 計算其距離光源的距離D2, 并將D2與第一步繪制中生成的深度貼圖中相應(yīng)的深度值D1進(jìn)行比較, 若D2>D1, 則表示該點(diǎn)與光源之間還有其他物體, 該點(diǎn)位于陰影中; 否則, 該點(diǎn)不在陰影中.
用傳統(tǒng)陰影映射算法對場景進(jìn)行實時渲染, 需要在每幀中對場景進(jìn)行兩次繪制. 第一次繪制生成整個場景的深度紋理, 第二次繪制計算整個場景的陰影. 如果場景中某個物體是靜止的, 則其深度信息保持不變, 不需要在每幀中都對該物體計算深度信息. 傳統(tǒng)陰影映射算法的一個明顯缺陷就是只使用了一種深度紋理, 對場景中的所有物體均采用相同的處理方式, 而未對不同運(yùn)動狀態(tài)的物體分開處理. 無論場景中的物體深度信息是否發(fā)生改變, 傳統(tǒng)算法都需要在每幀中重新生成整個場景的深度紋理, 從而降低了算法的效率.
本文提出動態(tài)深度紋理和靜態(tài)深度紋理的概念. 將傳統(tǒng)算法中的一張深度紋理分成動態(tài)深度紋理和靜態(tài)深度紋理兩張紋理. 動態(tài)深度紋理用于儲存當(dāng)前場景中處于運(yùn)動狀態(tài)物體的深度信息, 該紋理需要在每幀中動態(tài)生成; 靜態(tài)深度紋理用于儲存當(dāng)前場景中處于靜止?fàn)顟B(tài)物體的深度信息, 該紋理不需要在每幀中動態(tài)生成, 而是在某一幀中生成靜態(tài)深度紋理, 然后在之后的若干幀中重復(fù)使用該深度紋理. 如圖2所示的場景中, 箱子是靜止的物體, 而人物模型是運(yùn)動的物體, 在傳統(tǒng)算法中, 需要用同一個深度紋理記錄整個場景中的深度信息. 將深度紋理以明暗形勢顯示出來, 則傳統(tǒng)算法的深度紋理如圖3所示, 本文方法提出的靜態(tài)深度紋理和動態(tài)深度紋理分別如圖4和圖5所示.
圖2 虛擬場景的陰影效果Fig.2 Shadow effect of virtual scene
圖3 傳統(tǒng)算法的深度紋理Fig.3 Depth texture of traditional algorithm
圖4 靜態(tài)深度紋理Fig.4 Static depth texture
圖5 動態(tài)深度紋理Fig.5 Dynamic depth texture
圖6 本文算法原理Fig.6 Principle of algorithm in this paper
一個復(fù)雜的虛擬現(xiàn)實場景中, 物體會有靜止和運(yùn)動兩種狀態(tài), 并且有的物體會在兩種運(yùn)動狀態(tài)中不斷切換, 所以需要動態(tài)地檢測場景中物體的運(yùn)動狀態(tài), 并根據(jù)運(yùn)動狀態(tài)對物體進(jìn)行分類. 本文采用的檢測方法為: 記錄場景中每個物體在世界坐標(biāo)系中的位置, 并在每幀的渲染中檢測各物體的位置. 如果某物體的位置信息發(fā)生變化, 則表示該物體處于運(yùn)動狀態(tài), 否則表示該物體處于靜止?fàn)顟B(tài). 該方法需要實時更新場景中物體的位置信息. 通過對場景中所有物體位置的動態(tài)監(jiān)測和更新, 實現(xiàn)對物體運(yùn)動狀態(tài)進(jìn)行動態(tài)的分類. 如果場景中的物體未發(fā)生運(yùn)動狀態(tài)的變化, 則不需更新靜態(tài)深度紋理, 只需計算動態(tài)深度紋理的深度信息; 如果場景中的物體發(fā)生了運(yùn)動狀態(tài)的變化, 則需同時更新動態(tài)深度紋理和靜態(tài)深度紋理的深度信息. 其中運(yùn)動狀態(tài)的變化可分為兩類: 如果某物體從運(yùn)動狀態(tài)轉(zhuǎn)化為靜止?fàn)顟B(tài), 則將該物體的深度信息從動態(tài)深度紋理中刪除, 并在靜態(tài)深度紋理中添加該物體的深度信息; 如果某物體從靜止?fàn)顟B(tài)轉(zhuǎn)化為運(yùn)動狀態(tài), 則將該物體的深度信息從靜態(tài)深度紋理中刪除, 并在動態(tài)深度紋理中添加該物體的深度信息, 此時該物體需要在每幀中重新計算深度信息.
實時檢測場景中物體的運(yùn)動狀態(tài)會影響程序的性能. 為了減少運(yùn)動狀態(tài)檢測對程序性能的影響, 如果虛擬場景中的某些物體運(yùn)動狀態(tài)始終不變, 則可根據(jù)實際情況減少需要檢測的物體個數(shù). 例如, 在某些電子游戲的城市場景中, 街道上的樓房始終是靜止不動的, 則不需要在每幀中去檢測其運(yùn)動狀態(tài).
本文算法原理如圖6所示. 計算某個像素是否處于陰影中, 需要先求出在某個像素上動態(tài)深度紋理記錄的深度值D1和靜態(tài)深度紋理記錄的深度值D2的最小值, 記為D3, 即D3=min{D1,D2}; 再計算該像素與光源的距離, 記為D. 如果D>D3, 則該像素位于陰影中, 否則該像素不位于陰影中.
在生成深度紋理時, 對動態(tài)物體和靜態(tài)物體分別生成動態(tài)深度紋理和靜態(tài)深度紋理, 但在計算陰影時, 不能只對某種運(yùn)動狀態(tài)的物體單獨(dú)使用某種深度紋理, 而要將兩種深度紋理求最小值再計算陰影. 這是因為不同種運(yùn)動狀態(tài)的物體可能會存在相互遮擋的關(guān)系, 即某種運(yùn)動狀態(tài)的物體可能處于另一種運(yùn)動狀態(tài)物體的陰影中. 如果對靜止的物體只應(yīng)用靜態(tài)深度紋理計算陰影, 則會導(dǎo)致運(yùn)動物體所產(chǎn)生的影子無法投射到靜止的物體上.
本文算法對靜止物體只計算一次深度紋理, 之后重復(fù)使用, 直到物體運(yùn)動狀態(tài)分布發(fā)生變化; 對于運(yùn)動物體, 在每幀中都計算其深度紋理. 因此, 本文算法的運(yùn)算效率受場景中物體運(yùn)動狀態(tài)分布的影響. 處于靜止?fàn)顟B(tài)的物體越多, 本文算法的運(yùn)算效率越高, 對傳統(tǒng)算法的優(yōu)化越明顯. 在極端情況下, 如果場景中物體始終處于靜止?fàn)顟B(tài), 則本文算法幾乎省去了傳統(tǒng)算法中的第一步操作, 極大提升了運(yùn)算效率. 如果場景中所有物體都一直保持運(yùn)動狀態(tài), 則本文算法很難得到效率上的優(yōu)化, 而且由于檢測場景運(yùn)動狀態(tài)對效率的影響, 該算法的運(yùn)算速度甚至?xí)缘陀趥鹘y(tǒng)陰影映射算法. 但根據(jù)對各種虛擬現(xiàn)實場景的分析可知, 在絕大多數(shù)大規(guī)模虛擬現(xiàn)實場景中, 都會出現(xiàn)一定比例的靜止物體, 所有物體均處于運(yùn)動狀態(tài)的情況很少. 本文算法的算法流程如圖7所示.
圖7 算法流程Fig.7 Flow chart of algorithm
用OpenGL 3.3作為圖形程序接口, 用Visual Studio2013作為開發(fā)工具, 在Windows7操作系統(tǒng)上實現(xiàn)本文算法. 該實驗的硬件環(huán)境為Intel i3處理器, 4 GB內(nèi)存, NVIDIA GeForce GT620顯卡, 1 GB顯存.
由于本文算法對場景中靜態(tài)物體和動態(tài)物體生成不同的深度紋理, 而在一個復(fù)雜場景中物體的靜止和運(yùn)動狀態(tài)可能會不斷變化, 所以為了驗證本文算法的效率, 需要模擬出運(yùn)動狀態(tài)不斷變化的特征. 因此實驗中設(shè)置了一個函數(shù)來指定場景中物體的運(yùn)動和靜止?fàn)顟B(tài), 記為函數(shù)P. 函數(shù)P通過生成隨機(jī)數(shù)指定某些物體運(yùn)動, 而另一些物體靜止. 每隔一段時間會調(diào)用一次該函數(shù), 通過這種方式模擬一個不斷變化的虛擬場景.
當(dāng)渲染不同的虛擬場景時, 場景中物體運(yùn)動狀態(tài)的分布會不同. 為了檢測本文算法應(yīng)對各種虛擬場景的運(yùn)行效率, 為函數(shù)P設(shè)置一個參數(shù)K表示場景中物體運(yùn)動狀態(tài)的分布.K值表示該場景中處于運(yùn)動狀態(tài)物體的面片數(shù)占所有物體面片數(shù)的百分?jǐn)?shù),K∈[0,1],K=0表示該場景中所有物體都是靜止的,K=1表示該場景中所有物體都是運(yùn)動的.
實驗分為兩部分. 第一部分實驗中, 檢測不同場景復(fù)雜度下本文算法的運(yùn)行效率. 實驗中設(shè)K=0.5, 通過改變場景中三角形面片數(shù)量來改變場景的復(fù)雜度, 并對每個場景分別應(yīng)用傳統(tǒng)陰影映射算法和本文改進(jìn)算法, 記錄每次實驗的渲染幀數(shù), 實驗結(jié)果列于表1. 由表1可見, 本文算法在一個較復(fù)雜的場景中, 在運(yùn)動物體和靜止物體數(shù)量相近的情況下, 能顯著提升場景的陰影渲染速度.
第二部分實驗檢測在場景復(fù)雜度相同的條件下, 場景運(yùn)動狀態(tài)分布不同時, 算法運(yùn)行效率的變化情況. 該實驗采用如圖8所示的一個實際項目中的真實場景: 若干輛汽車在街道中穿行. 在實驗中基于不同的K值設(shè)置運(yùn)動汽車和靜止汽車的數(shù)量, 然后檢測場景的渲染速度. 隨著K值(運(yùn)動物體所占百分?jǐn)?shù))的變化, 即處于運(yùn)動狀態(tài)汽車數(shù)量的變化, 陰影渲染速度的變化如圖9所示.
表1 當(dāng)K=0.5時傳統(tǒng)算法與改進(jìn)算法的渲染速度對比
圖8 3D項目中街道上的汽車場景Fig.8 Scene of cars from 3D project on street
圖9 在不同K值下傳統(tǒng)算法和改進(jìn)算法的渲染速度Fig.9 Rendering speed of traditional algorithm and improved algorithm at different K values
由圖9可見, 傳統(tǒng)陰影映射算法在每幀中都為整個場景生成一張深度紋理, 所以其運(yùn)行效率和K值無關(guān). 而本文算法將運(yùn)動物體和靜止物體區(qū)別對待, 當(dāng)K值改變時, 算法的運(yùn)行效率會發(fā)生改變. 隨著K值的增加, 本文算法的運(yùn)行效率呈線性遞減趨勢. 當(dāng)K值較小時, 本文算法的運(yùn)行效率明顯高于傳統(tǒng)陰影映射算法. 由于本文算法需要額外檢測場景中物體的運(yùn)動和靜止?fàn)顟B(tài), 當(dāng)K值增大到一定程度時, 本文算法的運(yùn)行效率會略低于傳統(tǒng)算法. 在本文實驗所繪制的虛擬場景中, 當(dāng)K≤0.8時, 本文算法的運(yùn)行效率優(yōu)于傳統(tǒng)陰影映射算法. 研究表明, 當(dāng)渲染復(fù)雜場景時, 場景中運(yùn)動物體所占的百分?jǐn)?shù)(K值)趨近于1屬于極個別情況, 即本文算法在絕大多數(shù)情況下運(yùn)行效率都優(yōu)于傳統(tǒng)算法.
綜上所述, 本文提出了一種改進(jìn)的陰影映射算法, 通過使用兩種不同類型的深度紋理(即動態(tài)深度紋理和靜態(tài)深度紋理)計算場景的陰影. 根據(jù)運(yùn)動狀態(tài)對場景中物體進(jìn)行分類, 對運(yùn)動物體和靜止物體分開處理, 僅實時更新動態(tài)深度紋理, 靜態(tài)深度紋理在某一幀中生成一次, 并在之后的若干幀中重復(fù)使用, 改進(jìn)了傳統(tǒng)算法中對深度信息不改變靜止物體仍要實時計算深度信息的不足. 實驗結(jié)果表明, 對于絕大多數(shù)復(fù)雜場景的渲染, 本文算法的渲染速度都明顯優(yōu)于傳統(tǒng)陰影映射算法.
[1] 張威巍. 虛擬環(huán)境中陰影的實時繪制算法研究 [D]. 鄭州: 解放軍信息工程大學(xué), 2009. (ZHANG Weiwei. Research on Real-Time Rendering Algorithms of Shading and Shadows in Virtual Environment [D]. Zhengzhou: PLA Information Engineering University, 2009.)
[2] 沈瀟. 三維場景實時陰影算法的研究與實現(xiàn) [D]. 重慶: 重慶大學(xué), 2006. (SHEN Xiao. The Research and Implementation of Real-Time Shadow Algorithms in 3D Scene [D]. Chongqing: Chongqing University, 2006.)
[3] 李凌春. 面向游戲與動畫應(yīng)用的陰影技術(shù)研究 [D]. 上海: 上海交通大學(xué), 2008. (LI Lingchun. Soft Shadow Rendering for 3D Games and Animations [D]. Shanghai: Shanghai Jiaotong University, 2008.)
[4] 蔣偉, 李小龍, 劉亞威. 基于有理數(shù)階偏微分的圖像增強(qiáng)新模型 [J]. 四川大學(xué)學(xué)報(自然科學(xué)版), 2016: 53(1): 47-53. (JIANG Wei, LI Xiaolong, LIU Yawei. Image Enhancement New Model Based on Rational-Order Partial Differential [J]. Journal of Sichuan University (Natural Science Edition), 2016: 53(1): 47-53.)
[5] 夏欣, 葛龍, 孟宏源. 基于改進(jìn)CV的圖像分割 [J]. 四川大學(xué)學(xué)報(自然科學(xué)版), 2017, 54(6): 1185-1189. (XIA Xin, GE Long, MENG Hongyuan. Image Segmentation Based on an Improved CV Model [J]. Journal of Sichuan University (Natural Science Edition), 2017, 54(6): 1185-1189.)
[6] 張德發(fā), 肜麗. 多光源圖像細(xì)化和細(xì)節(jié)增強(qiáng)的協(xié)同圖像處理算法研究 [J]. 重慶郵電大學(xué)學(xué)報(自然科學(xué)版), 2014, 26(2): 260-264. (ZHANG Defa, RONG Li. Multi-light Source Image Defined and Enhanced Image Processing Algorithms [J]. Journal of Chongqing University of Posts and Telecommunications (Natural Science Edition), 2014, 26(2): 260-264.)
[7] 過潔, 徐曉旸, 潘金貴. 基于陰影圖的陰影生成算法研究現(xiàn)狀 [J]. 計算機(jī)輔助設(shè)計與圖形學(xué)學(xué)報, 2010, 22(10): 580-590. (GUO Jie, XU Xiaoyang, PAN Jingui. Present Status of Shadow Generation Algorithms Based on Shadow Maps [J]. Journal of Computer—Aided Design & Computer Graphics, 2010, 22(10): 580-590.)
[8] 朱山. 基于OpenGL的實時陰影算法研究 [D]. 武漢: 華中科技大學(xué), 2011. (ZHU Shan. The Research of Real-Time Shadow Algorithms Based on OpenGL [D]. Wuhan: Huazhong University of Science and Technology, 2011.)
[9] 劉力. 實時陰影渲染 [D]. 上海: 上海交通大學(xué), 2008. (LIU Li. Real Time Shadow Rendering [D]. Shanghai: Shanghai Jiaotong University, 2008.)
[10] 吳躍. 基于GPU的實時陰影算法研究 [D]. 蘇州: 蘇州大學(xué), 2009. (WU Yue. Research on Real-Time Shadow Algorithm Based on GPU [D]. Suzhou: Soochow University, 2009.)
[11] 周毓. 游戲中實時渲染的研究與應(yīng)用 [D]. 北京: 北京交通大學(xué), 2013. (ZHOU Yu. Research and Application of Real-Time Rendering in the Game [D]. Beijing: Beijing Jiaotong University, 2013.)
[12] Cook R L, Porter T, Carpenter L. Distributed Ray Tracing [J]. ACM SIGGRAPH Computer Graphics, 1984, 18(3): 137-145.
[13] Crow F C. Shadow Algorithms for Computer Graphics [J]. ACM SIGGRAPH Computer Graphics, 1977, 11(2): 242-248.
[14] Williams L. Casting Curved Shadows on Curved Surfaces [J]. ACM SIGGRAPH Computer Graphics, 1978, 12(3): 270-274.
[15] Peters C, Klein R. Moment Shadow Mapping [C]//19th ACM SIGGRAPH Symposium on Interactive 3D Graphics and Games (i3D). New York: ACM, 2015: 7-14.
[16] Selgrad K, Dachsbacher C. Filtering Multi-layer Shadow Maps for Accurate Soft Shadows [J]. Computer Graphics Forum, 2015, 34(1): 205-215.
[17] Liktor G, Spassov S. Stochastic Soft Shadow Mapping [J]. Computer Graphics Forum, 2015, 34(4): 1-11.
[18] Schw?rzler M, Luksch C, Scherzer D, et al. Fast Percentage Closer Soft Shadows Using Temporal Coherence[C]//Proceedings of the ACM SIGGRAPH Symposium on Interactive 3D Graphics and Games. New York: ACM, 2013: 79-86.
[19] Lecocq P, Marvie J E, Sourimant G, et al. Sub-pixel Shadow Mapping [C]//Proceedings of the 18th Meeting of the ACM SIGGRAPH Symposium on Interactive 3D Graphics and Games. New York: ACM, 2014: 103-110.