許哲
(四川大學(xué)計(jì)算機(jī)學(xué)院,成都 610065)
基于層次遮擋圖的軟陰影渲染
許哲
(四川大學(xué)計(jì)算機(jī)學(xué)院,成都610065)
離散化;多層次;陰影因子
隨著現(xiàn)代計(jì)算機(jī)圖形圖像技術(shù)的發(fā)展,在虛擬現(xiàn)實(shí)和工業(yè)仿真領(lǐng)域,陰影已經(jīng)被不同程度的集成到各種各樣的渲染系統(tǒng)中,并在各種應(yīng)用中扮演著十分重要的角色。陰影圖[1]和陰影體[2]算法是目前應(yīng)用中最為廣泛的兩種實(shí)時(shí)軟陰影的渲染技術(shù)。陰影體算法太依賴(lài)于場(chǎng)景的復(fù)雜度,很難保證算法的高效性;大多數(shù)基于陰影貼圖的軟陰影算法都只存儲(chǔ)了場(chǎng)景表面的一層深度信息,很容易產(chǎn)生漏光現(xiàn)象。對(duì)此,本文在陰影貼圖算法的基礎(chǔ)上,通過(guò)存儲(chǔ)多層場(chǎng)景信息,并且結(jié)合后投影[3]和三線性插值算法,生成一種高效且逼真的軟陰影。
與傳統(tǒng)陰影映射的方法類(lèi)似,本文提出的算法由兩個(gè)繪制遍組成:第一個(gè)繪制遍將視點(diǎn)放在光源的位置渲染場(chǎng)景,用于生成深度圖和遮擋圖;第二個(gè)繪制遍是在常規(guī)視點(diǎn)下,通過(guò)處理之前生成的深度圖和遮擋圖中的信息進(jìn)行場(chǎng)景渲染。與傳統(tǒng)方法不同的是,本文中的深度圖和遮擋圖都是多層次結(jié)構(gòu),即二維紋理數(shù)組。這種結(jié)構(gòu)的渲染將場(chǎng)景離散化,深度圖中存儲(chǔ)深度信息,遮擋圖中存儲(chǔ)離散化點(diǎn)的陰影因子。
1.1計(jì)算遮擋區(qū)域
將視點(diǎn)置于光源處渲染場(chǎng)景時(shí),需要對(duì)場(chǎng)景進(jìn)行離散化處理。多層次深度圖和遮擋圖就是離散化后的存儲(chǔ)結(jié)構(gòu),兩者的結(jié)構(gòu)相同,但是存儲(chǔ)的內(nèi)容不同:深度圖中存儲(chǔ)每個(gè)點(diǎn)的深度信息,遮擋圖中存儲(chǔ)遮擋比例,也就是在此點(diǎn)處光源被遮擋的比例。
在圖1(a)中,O為距離光源最近的遮擋點(diǎn),假設(shè)它與光源平行,且它所能遮擋的范圍稱(chēng)為陰影區(qū)域。當(dāng)把陰影區(qū)域反投回深度圖時(shí),會(huì)在深度圖(近平面)上產(chǎn)生一段區(qū)域,這個(gè)區(qū)域稱(chēng)為內(nèi)核。在一個(gè)內(nèi)核中存在很多采樣點(diǎn),由于深度圖是多層次結(jié)構(gòu),所以在每個(gè)采樣點(diǎn)的位置對(duì)應(yīng)多個(gè)被遮擋點(diǎn)。在圖1(b)中,s2是一個(gè)采樣點(diǎn),通過(guò)s2獲得的內(nèi)核中包含三個(gè)采樣點(diǎn),分別為s1,s2,s3。在s1中存儲(chǔ)了中存儲(chǔ)了中存儲(chǔ)了這些點(diǎn)都在s2的內(nèi)核遮擋區(qū)域內(nèi),所以這些點(diǎn)的遮擋因子都要通過(guò)s2計(jì)算。
內(nèi)核的大小可以通過(guò)計(jì)算得到,在圖1(a)中,O是距離光源最近的遮擋點(diǎn),且平行于光源。它們之間的產(chǎn)生的中間變量z'可以由公式(1)求得。
其中,z是O到光源的距離,w和n分別是近平面的寬度和其到光源的距離;r是深度圖的分辨率大小,l是光源的寬度。內(nèi)核的大小wk可以由公式(2)計(jì)算得到。
圖1 遮擋示意圖
其中,d是接收面到光源的距離。對(duì)應(yīng)于深度圖中每個(gè)紋理坐標(biāo)(u,v)上的采樣點(diǎn),都需要計(jì)算各自的內(nèi)核大小。
1.2算機(jī)遮擋與因需
在圖1(b)中可以看到,每個(gè)采樣點(diǎn)都對(duì)應(yīng)一個(gè)內(nèi)核,在內(nèi)核中有很多潛在的被遮擋點(diǎn),這些被遮擋點(diǎn)都可能被采樣點(diǎn)中的點(diǎn)所遮擋。所以,針對(duì)內(nèi)核中的每個(gè)被遮擋點(diǎn),都需要計(jì)算其被遮擋的比例,也就是其遮擋因子。本文采用后投影的方法將被遮擋點(diǎn)通過(guò)遮擋點(diǎn)將其投影到光源,如圖2(a)所示,將投影到光源,光源與投影區(qū)域會(huì)有一部分重疊,重疊部分的光源相對(duì)于來(lái)說(shuō)是不可見(jiàn)的,所以的遮擋因子可以通過(guò)重疊區(qū)域計(jì)算得到。
運(yùn)用此方法計(jì)算之后可以發(fā)現(xiàn),同一個(gè)點(diǎn)可能位于多個(gè)采樣點(diǎn)的遮擋內(nèi)核中,所以它會(huì)被多個(gè)遮擋點(diǎn)遮擋,如果將每個(gè)遮擋點(diǎn)產(chǎn)生的重疊面積相加,會(huì)導(dǎo)致一些面積被重復(fù)加了多次,從而產(chǎn)生較暗的陰影,所以,本文算法只將距離被遮擋點(diǎn)最近的遮擋點(diǎn)投影回光源計(jì)算重疊面積即可。
1.3三線信號(hào)的插值
本文算法中提出的三線性插值過(guò)濾算法依賴(lài)于場(chǎng)景中點(diǎn)的深度。當(dāng)在正常視點(diǎn)下渲染場(chǎng)景時(shí),場(chǎng)景中的每個(gè)點(diǎn)需要被轉(zhuǎn)換到光源坐標(biāo)系下得到其在深度圖中的紋理坐標(biāo),以及該紋理坐標(biāo)上下左右四個(gè)方向的坐標(biāo)。圖2(c)展示的是在2維空間下的示意圖,s1和s2是通過(guò)點(diǎn)p得到的鄰近采樣點(diǎn),p的深度用于確定采樣點(diǎn)的包圍層。比如,在s1中存儲(chǔ)的第一層和第二層包圍了點(diǎn)p,因?yàn)楫?dāng)包圍p點(diǎn)的各個(gè)點(diǎn)確定了以后就可以將這些點(diǎn)的遮擋因子進(jìn)行插值,在圖2(c)中,注釋了每個(gè)點(diǎn)的深度值z(mì)和其遮擋因子ρ。對(duì)于采樣點(diǎn)長(zhǎng)度和
圖2 算法示意圖
但是,求到的包圍層并不總正確??紤]圖2(d)中的p2點(diǎn),在采樣點(diǎn)s2中存儲(chǔ)的第一層的點(diǎn)的深度由于比p2遠(yuǎn),故只能作為p2下邊緣的包圍層,但是這樣的話就得不到上包圍層,無(wú)法進(jìn)行插值。針對(duì)這種情況,本文設(shè)置一層虛擬包圍層,這個(gè)包圍層被置于光源位置,并且假設(shè)此層被完全照亮,即其遮擋因子為0。
另外,考慮圖2(d)中的p3點(diǎn),在采樣點(diǎn) s3中存儲(chǔ)的第二層的點(diǎn)的深度由于比p3近,故只能作為p3上邊緣的包圍層,但是這樣的話就得不到下包圍層,無(wú)法進(jìn)行插值。針對(duì)這種情況,本文也設(shè)置一層虛擬包圍層,這個(gè)包圍層被置于渲染的遠(yuǎn)平面,并且假設(shè)此層被完全遮蔽,即其遮擋因子為1。
再考慮圖2(d)中的p4點(diǎn),從圖中可以看出,p4處于全影中,即被完全遮蔽,但是若使用插值的方法,p4則被計(jì)算為部分遮蔽,因?yàn)閟2和s3中存儲(chǔ)的第一層都被完全照亮,當(dāng)它們參與插值計(jì)算時(shí),p4點(diǎn)的遮擋因子一定處于0到1之間。針對(duì)這種情況,本文算法首先檢查4個(gè)上邊界是不是在同一層上,如果在同一層,就將上邊界的陰影因子設(shè)置為1。這種方法適用于p4點(diǎn),因?yàn)樗纳线吔缍嘉挥诘谝粚樱赃M(jìn)行插值后,p4點(diǎn)的陰影因子為1。
插值的方式適用于大多數(shù)情況,但是仍然有些情況是插值解決不了的。比如圖2(d)中的p5點(diǎn),顯然p5是被完全照亮的,但是由于它周?chē)狞c(diǎn)都位于第一層,它們的陰影因子被設(shè)置為了1,再通過(guò)三線性插值,會(huì)導(dǎo)致p5的陰影因子不為0。這種錯(cuò)誤的產(chǎn)生是因?yàn)閜5的深度大于上邊界的深度,例如p5位于上邊界的凹面。當(dāng)深度圖的分辨率較小時(shí),會(huì)產(chǎn)生這種凹面,但是只要把深度圖的分辨率設(shè)置的足夠大,使其采樣足夠精確,這個(gè)錯(cuò)誤就可以避免。因此,在實(shí)驗(yàn)中,深度圖的分辨率被設(shè)置為1024×1024。
實(shí)驗(yàn)環(huán)境為處理器:Intel Core i5-2320 CPU@3.00 GHz 3.30 GHz;內(nèi)存:4.0GB;顯卡:AMD Radeon HD 6700 Series;操作系統(tǒng):Windows 7。
本文提出的基于多層次遮擋圖的軟陰影算法可以生成高質(zhì)量高速率的軟陰影。在以下實(shí)驗(yàn)結(jié)果中,光源大小都設(shè)置為2×2,屏幕分辨率和陰影圖的大小都為1024×1024,層次設(shè)置為8層。
圖3 ,圖4 分別顯示了PCSS(a)、后投影(b)、本文算法(c)三種方法渲染樹(shù)模型和桌椅模型的軟陰影效果,由對(duì)比可知PCSS生成陰影雖然有模糊的效果,但是由于受采樣點(diǎn)數(shù)目的影響,其陰影效果并不真實(shí);后投影運(yùn)用面積比例計(jì)算遮擋因子,其重疊現(xiàn)象較為明顯,可以清楚的看到后投影生成的軟陰影相比較與PCSS[4]和本文算法,效果相對(duì)較暗;然而本文算法不僅解決了重疊現(xiàn)象,且軟陰影效果更加逼真。
圖3 軟陰影繪制效果對(duì)比
本文采用多層結(jié)構(gòu)存儲(chǔ)深度圖和遮擋圖,并結(jié)合后投影渲染軟陰影方法,渲染出了效果較好的軟陰影效果。但本文也存在一些不足之處,由于使用插值的方式計(jì)算每個(gè)點(diǎn)的陰影因子,使得渲染效果不是特別精確,在陰影的精度上還需要繼續(xù)研究和改善。
[1]Lance Williams.Casting Curved Shadows on Curved Surfaces.In ACM Sig-graph Computer Graphics.ACM,1978,12:270-274.
[2]Vincent Forest,Loic Barthe,and Mathias Paulin.Accurate Shadows by Depth Complexity Sampling.In Computer Graphics Forum, Proc.Eurographics,2008:663-674.
[3]Gael Guennebaud,Loc Barthe,and Mathias Paulin.Real-Time Soft Shadow Mapping by Backprojection.In Proceedings of the 17th Eurographics Conference on Rendering Techniques.Eurographics Association,2006:227-234.
[4]Randima Fernando.Percentage-Closer Soft Shadows.In Acm Siggraph 2005 Sketches.ACM,2005:35.
Discretize;Multi-Layered;Shadow Factor
Layered Occlusion Map for Soft Shadow Generation
XU Zhe
(College of Computer Science,Sichuan University,Chengdu 610065)
許哲(1990-),女,四川成都人,本科,研究方向?yàn)橛?jì)算機(jī)圖形學(xué)、虛擬現(xiàn)實(shí)
2015-12-01
2016-01-10
對(duì)于場(chǎng)景中的三維模型,首先在光源中心位置對(duì)場(chǎng)景進(jìn)行離散化處理,生成多層次深度圖;然后計(jì)算深度圖中各點(diǎn)的陰影因子,將其存在具有相同結(jié)構(gòu)的遮擋圖中;最后在正常視點(diǎn)下渲染場(chǎng)景,對(duì)遮擋圖中的陰影因子進(jìn)行三線性插值,得到平滑且逼真的軟陰影。
For three-dimensional model,first discretizes the scene from the center of the light and generates a multi-layered depth map.Then computes the shadow factor of these points in the depth map and stores them into an occlusion map which has the same structure with depth map.Finally,renders the scene from camera.Processes the shadow factor from occlusion map by three linear interpolation and smooth soft shadows can be determined.