劉曉平, 王啟駿, 陳 皓, 張乃釗
(1.合肥工業(yè)大學(xué) 計算機與信息學(xué)院,安徽 合肥 230009;2.安徽工業(yè)大學(xué) 通信工程學(xué)院,安徽 馬鞍山 243002)
陰影的生成在計算機圖形學(xué)中一直是一項重要且富有挑戰(zhàn)性的課題。在虛擬場景中的陰影能夠有效地表現(xiàn)出不同物體之間的相對位置關(guān)系,增加圖像的立體感和層次感,從而提高虛擬環(huán)境的真實感程度[1]。目前圍繞陰影的生成人們已經(jīng)做過許多研究,主要的方法可分為掃描線算法、細節(jié)多邊形算法、陰影體(Shadow Volumes)算法、光線跟蹤算法、輻射度算法和陰影圖(Shadow Map)算法等。近年來,提出的陰影算法主要集中在對陰影圖和陰影體算法的改進及混合方法的研究上,這些算法都能較好地完成本影的計算,但對于軟陰影的生成大都存在速度較慢、算法資源消耗過大等缺點,無法很好地應(yīng)用于虛擬現(xiàn)實這樣對渲染速度有很高要求的場合。
隨著圖形硬件的快速發(fā)展,基于圖形硬件的實時陰影繪制研究取得了一定成果。復(fù)雜的圖形計算已經(jīng)逐步從CPU轉(zhuǎn)向圖形硬件的圖形處理單元[2](Graphics Processing Unit,簡稱 GPU)。通過GPU,可以加速處理更復(fù)雜的陰影計算,從而使陰影算法能夠生成更加逼真的陰影,能夠適用于大規(guī)模復(fù)雜場景的交互式繪制。
最早由文獻[3]提出的陰影圖算法是一種利用圖像空間的算法,該算法可以快速生成場景的陰影,由于其具有快速、簡單的優(yōu)點,被廣泛應(yīng)用于虛擬現(xiàn)實、仿真以及游戲等方面。
同時,陰影圖算法具有本身固有的缺點,由于算法是以紋理點采樣為基礎(chǔ)的,在生成陰影圖時,如果光源的投影方式設(shè)置得不恰當(dāng),會產(chǎn)生嚴重的走樣。這是由深度紋理的分辨率不夠造成的,特別是當(dāng)場景中的繪制點到光源和到視點的夾角較大時問題尤為嚴重,文獻[4]針對這個問題提出了有效的解決方法;關(guān)于軟陰影生成的方法,文獻[5]有很好的綜述。在軟陰影生成過程中最基本的操作是計算陰影點和區(qū)域光源相互間的可見性,可見光源部分的比例決定陰影點的亮度;文獻[6]提出了一種針對平面區(qū)域光源的軟陰影錐算法,該算法用一組采樣點來近似測試區(qū)域光源;文獻[7]針對可能出現(xiàn)的噪音,使用梯形分解區(qū)域光源,得到平滑的結(jié)果。
這些文獻提出的算法是針對區(qū)域光源根據(jù)物體的可見性計算陰影的亮度,獲得軟陰影的效果。而大部分的虛擬現(xiàn)實應(yīng)用中,更多使用點光源進行光照計算,點光源具有定義簡單,光照計算方便的優(yōu)點,但點光源在理論上無法產(chǎn)生軟陰影的效果,這使虛擬環(huán)境的真實感大打折扣。文獻[8]提出了百分比漸近濾波(PCF)的算法,通過陰影邊緣的平滑處理消除陰影貼圖的鋸齒現(xiàn)象,同時可以獲得近似的軟陰影,這種算法需要對陰影圖做一次高斯模糊。針對PCF效率較低的缺點,文獻[9]提出的VSM方法對PCF算法進行了效率上的改進。
PCF雖然可以獲得軟陰影的效果,但PCF獲得的軟陰影并不完全符合現(xiàn)實中的軟陰影表現(xiàn),如距離物體遠近不同的陰影在現(xiàn)實中應(yīng)該呈現(xiàn)出不同的亮度和模糊程度。文獻[10]提出了一種實時軟陰影生成方法,該方法預(yù)先生成2幅圖,即深度圖(depth map)和影區(qū)距離圖(shadow-width map),其中影區(qū)距離圖記錄陰影區(qū)中每個點距陰影區(qū)邊界的最短距離。在拷貝繪制時[11],利用深度圖可以判斷當(dāng)前點是否處于陰影區(qū);如果處于陰影區(qū),查找影區(qū)距離圖可得到當(dāng)前點到陰影區(qū)邊界的距離,以此決定當(dāng)前點的光線衰減量。但文獻[10]方法僅考慮了陰影到邊緣的距離,而并非陰影到投影物體的距離,而且該方法需要渲染2幅紋理,比較費時。本文對文獻[10]算法進行了改進,在保證渲染速度的前提下,僅使用一幅深度圖,在陰影亮度和模糊計算中增加了陰影到投影物體距離的因素,從而使陰影更加符合現(xiàn)實中的表現(xiàn)。
軟陰影是由于區(qū)域光源照射和物體間漫反射而產(chǎn)生的現(xiàn)象,由于物體在非點光源的照射下會產(chǎn)生部分照亮的情況,而相鄰物體對光線的反射會造成陰影的亮度不均,所以軟陰影呈現(xiàn)出的視覺特征主要有以下幾點。
(1)陰影邊緣模糊,由于在陰影邊緣上受到光源不同程度的照射造成。完全不受光源照射的部分稱為本影,受到部分照射的陰影稱為半影。半影處于本影的邊緣,且向外逐漸變亮,在視覺上造成陰影邊緣模糊的現(xiàn)象。
(2)陰影內(nèi)亮度不均,由相鄰物體間的漫反射、光線在空氣中的散射造成。從概率上說,陰影距離產(chǎn)生陰影的物體越近,被漫反射光線照亮的概率就越低,在視覺上造成的效果即距離物體越近的陰影亮度越低,而距離物體遠的陰影亮度越高。
(3)陰影邊緣的模糊程度變化,根據(jù)陰影的第1點特征,半影是由于光源的部分照射造成的,所以半影部分的大小會隨著陰影到物體的距離成正比變化,如圖1所示,造成陰影距離物體越遠越加模糊的視覺效果。
圖1 半影部分的大小隨距離的變化
但是在目前的虛擬現(xiàn)實等應(yīng)用中,最常用的光照方式仍然是點光源方式,利用點光源來模擬生成區(qū)域光源能產(chǎn)生的軟陰影的效果就成為了一個新的課題,即在點光源的照射下得到的生硬的陰影在算法的支持下得到區(qū)域光源照射下能夠得到的軟陰影的效果一樣。傳統(tǒng)的PCF算法就是一種點光源軟陰影生成算法,但是PCF算法生成的陰影在所有邊緣上的模糊程度是一致的,且陰影的亮度不會發(fā)生變化,在視覺上陰影顯得單調(diào)、呆板,且不符合物理上軟陰影的細節(jié)特征,文獻[10]是對PCF算法的改進,但該算法仍然未考慮更多軟陰影的視覺特征。本文算法在陰影圖算法的基礎(chǔ)上增加了投影距離的因素,增強了陰影的視覺表現(xiàn),其主要步驟如下。
(1)以光源為視點繪制場景,將場景的深度信息渲染到浮點格式的緩沖中,生成陰影映射圖。
(2)從攝影機位置,關(guān)閉所有光源的情況下,渲染場景陰影圖到一屏幕大小的紋理,進行反走樣處理,平滑陰影邊界,使用高斯濾波對紋理進行模糊處理。
(3)打開所有光源,將上一步模糊后的紋理投射到屏幕空間中,在片段著色器中計算陰影到物體的距離d,根據(jù)d修正陰影亮度,得到最終的軟陰影效果。
如圖2所示,從光源的位置渲染的陰影圖中保存了距離光源最近的各點距離,當(dāng)在某一方向上物體離光源的距離大于所有物體離光源的最近距離時,該物體處于陰影之中;反之,物體被照亮。
圖2 陰影圖原理及其效果示意
陰影圖是場景在光源為視點的投影空間中的一個二維投影,投影圖像中的每個像素的值代表著場景里離光源最近可見表面的像素深度值。首先將視點的位置與光源的位置重合并設(shè)置投影的方向,在此位置渲染整個場景中的所有物體,將得到的所有的深度值保存到每個像素的顏色分量中,由此就會得到代表與視點位置距離最近的二維紋理即陰影圖。
陰影圖中最有價值的是像素的深度值,其在第1次渲染中被存儲于像素的顏色分量中,在繪制陰影時被用來作對比,在視點空間的像素點的位置轉(zhuǎn)換到光源空間與光源的距離與深度圖中相應(yīng)位置深度值作比較,如果值較大則說明該像素點不是離光源最近的點,就必然有像素點擋在該像素點前方,因此該像素點應(yīng)該顯示為黑色,則會產(chǎn)生“生硬的陰影”。
在生成陰影的片段程序中如果只輸出照亮與否的信息,同樣渲染出一張視點亮度紋理圖,并根據(jù)距離對其運用高斯模糊,完成以后再在視點空間以該模糊紋理作為參照就會生成最終的模糊效果。
在正式渲染場景時,為得到頂點對應(yīng)陰影圖中的紋理坐標,需對頂點乘以陰影圖生成時所使用的投影矩陣和模型視圖矩陣(即以光源為視點時所采用的投影矩陣、模型視圖矩陣),由于投影矩陣作用得到的值是在[-1,1]范圍內(nèi),而紋理坐標值的范圍是在[0,1]之間,所以,在片段程序中將原始像素點位置在光源位置處投射得到的坐標統(tǒng)一做乘加變換,可得到該點對應(yīng)于深度圖距離光源最近點的紋理坐標。因為是硬件執(zhí)行,所以比在CPU上進行矩陣乘法的計算要快許多。
計算出頂點對應(yīng)陰影圖中的紋理坐標后,可以在片段程序中進行比較判斷該點是否在陰影內(nèi),紋理投影矩陣中的z/w得到的即是頂點到光源的距離k,而通過對陰影圖的紋理映射索引,可以得到該方向上離光源最近的物體深度t。當(dāng)k>t時頂點處于陰影中,反之頂點被照亮。傳統(tǒng)的陰影圖算法中光照計算公式為:
其中,L為光源輻射度;θi為入射角;θl為光線和法向夾角;A為物體表面積;V為物體可見度,V可通過比較物體距離光源深度和陰影圖深度得到。
PCF算法在片段程序中,通過高斯模糊可以得到視覺上的軟陰影,但PCF算法未考慮陰影到物體的距離,這在視覺上造成了離物體不同距離的陰影邊緣同樣模糊的錯誤,而在現(xiàn)實中,一般距離物體近的陰影亮度較低,邊緣較清晰,距離物體遠的陰影亮度較高,邊緣較模糊。
如前文所述,紋理投影矩陣中的z/w即頂點到光源的距離k,在陰影圖紋理中索引可以得到物體的深度t,所以d=k-t即陰影到物體的距離。以d作為光照函數(shù)的因子,可以得到隨陰影到物體距離不斷衰減的陰影。
另一方面,根據(jù)d選擇高斯模糊的半徑,即離物體越遠的陰影越模糊,最后得到修正后的可見度計算公式為:
其中,d為陰影到物體的距離;v(x,y)為x,y點的可見度;Radius為用于高斯模糊的半徑常數(shù),最終光照計算公式為:
基于以上的研究成果,本文設(shè)計并實現(xiàn)了基于陰影圖的改進軟陰影生成算法,對傳統(tǒng)陰影算法的視覺效果進行了改進。實驗用的計算機配置為Intel Xeon 3.0GHz CPU、Geforce 8600GT顯卡、1G內(nèi)存。
為了方便對比說明,分別采用3種算法渲染柱體的陰影,如圖3所示。雖然圖3b通過模糊處理消除了圖3a中的鋸齒現(xiàn)象,但整個陰影的邊緣具有同樣的模糊程度,無法體現(xiàn)出陰影和投影物體間的距離關(guān)系,顯然圖3c的結(jié)果更加符合現(xiàn)實中陰影的表現(xiàn)。
圖3 柱體的陰影
對復(fù)雜物體的渲染算法的效果比較,如圖4所示。使用傳統(tǒng)的陰影圖結(jié)果如圖4a所示,傳統(tǒng)陰影圖算法生成的陰影沒有柔和的邊緣,視覺上非常生硬;圖4b使用百分比漸近濾波(PCF)算法生成的陰影具有柔和的邊緣,但陰影邊緣的柔和程度和陰影到物體的距離無關(guān),不符合實際情況;圖4c使用本文改進的算法生成的陰影在離物體近處具有較清晰的邊緣,而距離物體越遠的陰影越模糊,且亮度越高,更加符合現(xiàn)實中的視覺感受。
圖4 算法比較
在速度上,因為陰影圖算法無需迭代,所以具有最好的渲染速度,而本文提出的算法(近點模糊半徑0.3,遠點模糊半徑2.0)和PCF算法使用近似的迭代次數(shù),所以在渲染速度上非常接近,可以獲得令人滿意的渲染幀數(shù),算法在效率上的表現(xiàn)見表1所列。
表1 算法效率對比 幀/s
陰影是重要的真實感圖形渲染要素之一,真實的陰影可以提供更準確的物體相對位置關(guān)系和更真實的光照感受。消除陰影鋸齒和增強真實感是研究基于陰影圖的陰影生成算法的重要課題。本文在陰影圖的基礎(chǔ)上對傳統(tǒng)軟陰影算法的視覺效果做出了一定改善,實驗證明,本算法可以在保證渲染效率的基礎(chǔ)上得到更加符合實際的視覺效果。然而,無論是PCF算法還是本文提出的改進算法,都只是在視覺上接近真實,并不是在物理上符合光照的漫反射造成軟陰影的原理,真正符合物理原理的軟陰影光照的研究還有待更加深入的研究。
[1]劉列明,吳恩華.一種基于點光源的三維陰影的實時生成算法[J].軟件學(xué)報,2000,11(6):785-790.
[2]吳恩華,柳有權(quán).基于圖形處理器(GPU)的通用計算[J].計算機輔助設(shè)計與圖形學(xué)學(xué)報,2004,16(5):601-612.
[3]Reeves W,Salesin,D,Cook R.Rendering antialiased shadows with depth maps [C ]//Proc SIGGRAPH,1987:283-291.
[4]Fernando R,F(xiàn)ernandez S,Bala K,et al.Adaptive shadow maps [C]//Proc SIGGRAPH 2001, Los Angeles,2001:387-390.
[5]Hasenfratz J M,Lapierre M,Holzschuchn,et al.A survey of real-time soft shadow’s algorithms[J].Computer Graphics Forum,2003,22(4):753-774.
[6]Laine S,Aila T,Assarsson U,et al.Soft shadow volumes for ray tracing [J].ACM Trans Graph,2005,24(3):1156-1165.
[7]周國民,盧滌非,張其前.一種梯形結(jié)構(gòu)的軟陰影錐生成方法[J].浙江大學(xué)學(xué)報:理學(xué)版,2007,34(6):628-632.
[8]Reeves W,Salesin,D,Cook R.Rendering antialiased shadows with depth maps [C ]//Proc SIGGRAPH,1987:283-291.
[9]Williams D,Andrew L.Variance shadow maps[C]//Proceedings of the 2006Symposium on Interactive 3DGraphics and Games,2006:213-220.
[10]Kirsch F,Doellner J.Real-time soft shadows using a single light sample[J].Journal of Winter School on Computer Graphics,2003,11(1):255-262.
[11]凌寶紅,侯整風(fēng),胡東輝,等.基于Gabor濾波的魯棒復(fù)制-粘貼圖像取證方法[J].合肥工業(yè)大學(xué)學(xué)報:自然科學(xué)版,2010,33(7):980-983.