鄭軍將,王毅剛
(杭州電子科技大學(xué)圖形圖像研究所,浙江杭州310018)
陰影就是光源的有部分光線被遮擋而無法到達(dá)的區(qū)域[1]。陰影對(duì)提升虛擬現(xiàn)實(shí)中的真實(shí)感和視覺線索至關(guān)重要。通過陰影可以判定物體空間關(guān)系、遮擋物形狀以及光源的位置方向等。不正確的陰影將大大削減場(chǎng)景真實(shí)性,所以計(jì)算機(jī)繪制的陰影必須要足夠可信。近些年來,人們對(duì)陰影做了很多研究工作,提出的算法包括百分比靠近濾波、方差陰影映射、卷積陰影映射和指數(shù)陰影映射等硬陰影技術(shù),還有各種軟陰影技術(shù)。它們主要基于陰影圖(Shadow Mapping,SM)、陰影體(Shadow Volumes,SV)還有全局光照(Global Illumination,GI)的原理。相對(duì)陰影體和全局光照,陰影圖的算法不需要分析場(chǎng)景的幾何信息,依賴陰影圖可以計(jì)算陰影區(qū)域,適合計(jì)算機(jī)實(shí)時(shí)繪制陰影。但是陰影圖的算法是基于點(diǎn)采樣,這將導(dǎo)致計(jì)算邊緣陰影時(shí)出現(xiàn)邊緣鋸齒狀走樣,物體表面自陰影等現(xiàn)象。百分比濾波算法(Percentage Closer Filtering,PCF)是基于陰影映射算法,通過對(duì)陰影圖濾波,使邊緣變平滑,可以有效減輕邊緣鋸齒走樣,使陰影更加逼真。
陰影圖算法是百分比濾波算法的基礎(chǔ),算法運(yùn)用z-buffer深度緩沖構(gòu)建陰影圖,通過采樣點(diǎn)和陰影圖的深度值做比較,判斷采樣片元是否在陰影中,如圖1所示。算法主要分成兩個(gè)步驟:(1)將照相機(jī)放在光源位置上,產(chǎn)生深度緩存紋理,此紋理的每個(gè)象素點(diǎn)記錄光源通過該象素點(diǎn)與場(chǎng)景中物體相交的最近深度值,即最近交點(diǎn)到光源的距離;(2)將照相機(jī)放在實(shí)際視點(diǎn)位置上,并使用第一步得到的深度紋理來進(jìn)行陰影測(cè)試,通過比較給定點(diǎn)與此深度值的關(guān)系,即可判定該點(diǎn)是否位于陰影內(nèi)[2]。陰影圖算法是基于采樣點(diǎn)的深度值和深度圖中的相應(yīng)Z值作比較,比較的結(jié)果是二值化的,導(dǎo)致邊緣不可能平滑,如果采用深度值和深度圖的均值做比較,雖然能柔化邊緣,但是繪制效果將嚴(yán)重偏離物體的幾何形狀。
百分比濾波算法[3]在SM的基礎(chǔ)上調(diào)換濾波比較的順序。首先將采樣點(diǎn)的Z值和深度圖區(qū)域內(nèi)的點(diǎn)做比較,再將區(qū)域比較的二值化結(jié)果百分比化,根據(jù)百分比值可以判斷采樣點(diǎn)在陰影中的程度,即半影的值。從而生成邊緣平滑的硬陰影或者半影大小固定的軟陰影效果。PCF的計(jì)算如下:pcf(P)=P為渲染的點(diǎn),PS為其映射到陰影圖中對(duì)應(yīng)的點(diǎn),N(*)是陰影紋理圖周邊的元素,ω(*)代表濾波核的權(quán)值,S(*)是二進(jìn)制的陰影測(cè)試函數(shù),比較(P點(diǎn)在光照空間的深度)和Zq(陰影圖q點(diǎn)的深度)。
圖1 陰影圖算法的原理圖
PCF算法的步驟:(1)對(duì)每個(gè)場(chǎng)景中的光源都要?jiǎng)?chuàng)建一副深度紋理圖,并從光源位置記錄場(chǎng)景中所有物體的的深度值。在光源空間中,X和Y坐標(biāo)指示了象素在深度圖中的位置,而Z值紀(jì)錄了象素到光源位置的深度距離;(2)從照相機(jī)視點(diǎn)出發(fā)渲染場(chǎng)景。每個(gè)渲染單元都先被映射到光源空間,得到相應(yīng)的深度圖位置。運(yùn)用百分比濾波算法得到采樣點(diǎn)在深度圖相應(yīng)區(qū)域的百分比值,根據(jù)百分比稀釋光的強(qiáng)度。如果有多個(gè)光源存在,那么要循環(huán)多次。
PCF算法的不足:預(yù)濾波是傳統(tǒng)的紋理映射的應(yīng)用,如mipmap,SAT等,它事先將紋理信息保存,需要的時(shí)侯可以快速提取,提高效率。但是PCF算法將采樣點(diǎn)和深度圖先做比較再濾波,每個(gè)采樣點(diǎn)比較的結(jié)果都是未知的,導(dǎo)致無法進(jìn)行預(yù)濾波操作,限制了PCF算法效率。PCF算法是基于深度圖,而深度圖有限的分辨率會(huì)導(dǎo)致Z-Fighting現(xiàn)象,所以PCF算法存在自陰影的問題。
根據(jù)百分比濾波算法的不足,本文采用分層的陰影圖和梯度陰影映射對(duì)算法的效率和效果做改進(jìn)。
分層的陰影圖技術(shù)[4]就是最大最小深度的mipmap技術(shù)。它以標(biāo)準(zhǔn)的深度圖為基礎(chǔ),創(chuàng)建最大最小的mipmap。假設(shè)有一副1 024×1 024的深度圖,那么首先將創(chuàng)建兩個(gè)512×512的紋理通道,一個(gè)通道存儲(chǔ)相鄰的4個(gè)象素的最小值,第二個(gè)通道存儲(chǔ)這4個(gè)象素的最大值。同樣的辦法一直創(chuàng)建到2×2 mip層。對(duì)于采樣點(diǎn)的Z值輸入,從最底層的mip層開始比較。如果Z<min,則潛在深度圖中的象素都無法遮擋此采樣點(diǎn),判定此采樣點(diǎn)不在陰影中。相反,如果Z>max,則潛在的深度圖中的象素都可以遮擋此采樣點(diǎn),判定此采樣點(diǎn)在陰影中。當(dāng)min<Z<max時(shí),無法判定采樣點(diǎn)的情況,陰影查找向下層的mip層移動(dòng)。通過不停的遞歸操作,總能找到可以判定的mip層。最壞的情況是移動(dòng)到最高層的mip層,即原來的深度圖中,此時(shí)max等于min值。通過HSM,可以提升PCF算法的效率,減少采樣點(diǎn)的比較次數(shù)。
PCF算法中陰影圖的分辨率是有限的,導(dǎo)致平面上的多個(gè)相鄰面元可能對(duì)應(yīng)深度圖中的同一位置,但是離散化后的面元的深度值并不相同,直接做比較就導(dǎo)致Z fighting現(xiàn)象,也就是在物體表面生成帶狀的自陰影。一般可以通過增加深度偏移來糾正。但是實(shí)際上,深度偏移值的選擇是一個(gè)更大的問題,它是動(dòng)態(tài)變化的,每個(gè)面元都不一樣。原先的PCF算法中深度偏移值是一個(gè)常量加一個(gè)隨機(jī)量的形式,并不能很好反映出物體表面面元間的關(guān)系。梯度陰影映射技術(shù)[5、6]是利用采樣點(diǎn)的梯度值作為深度偏移量,正確的反映了空間幾何關(guān)系。這里的梯度指的是深度圖中的梯度變化,而不是屏幕空間,轉(zhuǎn)化的表達(dá)式[7]為,其中表示深度圖中的梯度向量,是屏幕空間到深度紋理空間的雅各比矩陣,采樣點(diǎn)在屏幕空間中的梯度向量
在PC平臺(tái)(Inter Core i5-2 300,4 GB RAM,NVIDIA GeForce GTX 550 Ti)中使用DirectX10實(shí)現(xiàn)了改進(jìn)的PCF算法。
PCF的深度圖的分辨率設(shè)置為1 024×1 024,用PCF和帶分層陰影圖的PCF算法實(shí)現(xiàn)的場(chǎng)景,如圖2所示,得到的幀率分別為55frame/s和60frame/s。
在分層陰影圖的基礎(chǔ)上,PCF和帶深度陰影映射的PCF算法實(shí)現(xiàn)的場(chǎng)景,如圖3所示。圖3(a)左圖是基于分層陰影圖的PCF算法,發(fā)現(xiàn)有明顯的自陰影,圖3(b)是用分層陰影圖和深度陰影映射實(shí)現(xiàn)的PCF,可以發(fā)現(xiàn)對(duì)自陰影有所抑制。
圖2 渲染場(chǎng)景效果圖
圖3 不同深度偏移算法自陰影效果
本文通過對(duì)百分比濾波算法的介紹,對(duì)其渲染效率和渲染效果提出改進(jìn)。通過實(shí)驗(yàn)說明改進(jìn)后的PCF算法優(yōu)于原先的算法。本文主要圍繞點(diǎn)光源展開,今后的工作重點(diǎn)研究其它光源和多光源的情況。
[1] Hasenfratz Jean-Marc,Lapierre Marc,Holzschuch Nicolas.A survey of real- time soft shadows algorithms[J].Computer Graphics Forum,2003,22(4):753 -774.
[2] 王華,朱麗華,顧耀林.一種基于陰影圖的實(shí)時(shí)軟陰影算法[J].計(jì)算機(jī)應(yīng)用,2007,27(10):2 538-2 540.
[3] William R,Salesin D,Cook R.Rendering antialiased shadows with depth maps[J].ACM SIGGRAPH Computer Graphics,1987,21(3):283 -291.
[4] Guennebaud Gael,Barthe Loic,Paulin Mathias.Real- Time Soft Shadow Mapping by BackProjection[C].Cyprus:Europgraphics Association,2006:227-234.
[5] Schüler Christian.Eliminate surface acne with gradient shadow mapping[C].Virginia:Charles River Media,2006:200-217.
[6] Christian S.Multisampling extension for gradient shadow maps[C].Virginia:Charles River Media,2006:207 -218.
[7] 晏福興.改進(jìn)的百分比靠近軟陰影技術(shù)的研究與實(shí)現(xiàn)[J].計(jì)算機(jī)工程與應(yīng)用,2011,47(1):185-187.