清源游民 gameogre@gmail.com
陰影技術(shù)
Ogre支持兩種主流的動(dòng)態(tài)陰影技術(shù),模板(stencil)陰影與紋理(texture)陰影,每一種都有兩個(gè)變體:modulative 與additive。這四種技術(shù)完全兼容固定函數(shù)圖形流水線(xiàn),因此不需要可編程GPU支持。然而,可利用GPU程序進(jìn)行加速。在場(chǎng)景中只有使用一種陰影技術(shù),應(yīng)該在場(chǎng)景渲染這前進(jìn)行陰影技術(shù)相關(guān)設(shè)置(最好是在創(chuàng)建場(chǎng)景管理器之間)。通過(guò)調(diào)用SceneManager::setShadowTechnique()來(lái)設(shè)置技術(shù),參數(shù)指定技術(shù)的具體類(lèi)型。陰影技術(shù)缺省情況下被關(guān)閉。對(duì)于物體,投射與接收陰影可以在材質(zhì)中控制,也可以控制物體自己對(duì)自己投射。由于模板陰影算法的本質(zhì)特征,透明半透明的物體要么全部投射實(shí)心陰影要么根本不投影影,不可能得到半透明的陰影。而使用紋理陰影技術(shù)則可以。燈不能用來(lái)投射陰影。
模板陰影算法
模板陰影算法原理上來(lái)講比較簡(jiǎn)單:從光源的角度看一個(gè)可以投射陰影的物體,可以看到物體最外輪廓的
形狀,把這個(gè)輪廓沿光的方向延伸,形成一個(gè)空間體,就是所謂的陰影錐(shadow volume),很顯然,如果一
個(gè)物體被這個(gè)陰影錐包圍,那么這個(gè)物體就處于前面那個(gè)物體所投射的陰影中了。既然陰影錐是通過(guò)延伸的方式來(lái)增長(zhǎng)的,那么可以在延伸方向?qū)﹀F體的延伸范圍作出控制。在延伸方向上,有一端不能延伸,另外一端的延伸范圍控制按照下面兩個(gè)規(guī)則。第一,如果使用可編程圖形硬件,頂點(diǎn)程序可以對(duì)頂點(diǎn)進(jìn)行無(wú)限延伸。第二,如果使用固定函數(shù)圖形流水線(xiàn),延伸的范圍由光線(xiàn)衰減設(shè)置(點(diǎn)光源和聚光燈)或使用
SceneManager::setShadowDirectionalLightExtrusionDistance()來(lái)控制。在不使用加速圖形硬件的情況下,應(yīng)該盡量避免物體離光源過(guò)近,這樣會(huì)產(chǎn)生過(guò)于寬的陰影錐,導(dǎo)致不正確的陰影效果。根據(jù)算法原理,產(chǎn)生的陰影邊界非常明顯:一個(gè)像素要么在陰影中,要么不在。這帶來(lái)的好處是,即使陰影錐的延伸距離很大,也不會(huì)影響精度。可以講這種技術(shù)產(chǎn)生的陰影是一種“硬陰影"。紋理陰影技術(shù)可以”軟化“陰影。使用模板陰影技術(shù)需要邊列表(edge lists),標(biāo)準(zhǔn)的轉(zhuǎn)換工具在產(chǎn)生二進(jìn)制mesh文件時(shí)會(huì)創(chuàng)建邊列表,如果沒(méi)有,在程序中也可以用Mesh::buildEdgeList()來(lái)產(chǎn)生。因?yàn)橛袝r(shí)候,我們會(huì)代碼的方式來(lái)生成mesh,如果這時(shí)我們想使用模板陰影技術(shù),那么就要確保產(chǎn)生出邊列表數(shù)據(jù)。如果邊列表數(shù)據(jù)不存在,那么ogre會(huì)認(rèn)為你不希望這個(gè)物體投射陰影。
模板陰影優(yōu)化
Ogre能進(jìn)行一些一般的優(yōu)化。例如可使用硬件加速,可能通過(guò)光的方向與范圍來(lái)檢測(cè)它是否會(huì)對(duì)平截頭體
(frustum)產(chǎn)生影響,從面避免了計(jì)算那些不必要的陰影幾何體。ogre支持雙面模板,stencil-wrapping擴(kuò)展,
這些都能阻止不必要的原型安裝(primitive setup)與驅(qū)動(dòng)過(guò)載(driver overhead)。ogre使用相對(duì)廉價(jià)的Z-pass算法代替Z-Fail算法(當(dāng)Z-Fail算法不必要時(shí),假如相機(jī)處于一個(gè)陰影錐中,使用Z-pass算法會(huì)有問(wèn)題,這種情況下應(yīng)該使用Z-fail算法)。
陰影錐不受封閉幾何的影響。在下圖中,

衛(wèi)兵投射到地板上,投射的范圍內(nèi)有個(gè)封閉的箱子(此例中設(shè)定箱子不投射陰影)。根據(jù)現(xiàn)實(shí)世界的經(jīng)驗(yàn),箱子上會(huì)有衛(wèi)兵投射的陰影,如圖中所示。但光線(xiàn)經(jīng)過(guò)箱子阻擋后應(yīng)該不再前進(jìn),也就是說(shuō)陰影錐經(jīng)過(guò)箱子阻擋后不應(yīng)該延伸了,于是箱子后面的地板上不應(yīng)該再出現(xiàn)衛(wèi)兵的陰影(真實(shí)世界中出現(xiàn)箱子的陰影,但是此例設(shè)定箱子不產(chǎn)生陰影)。圖中的地板上出現(xiàn)了衛(wèi)兵投射的陰影,這說(shuō)明了陰影不會(huì)受到延伸方向上物體的影響。
在屏幕上看不到的物體也可以把陰影投影到可視的平截頭體(view frustum)中。雖然看不到,但是這些物體
也必須得被渲染,渲染他們純粹是為了得到產(chǎn)生陰影的相關(guān)數(shù)據(jù)。在不使用硬件加速的情況下,盡量避免物體離光源過(guò)近。
紋理陰影
紋理陰影算法的基本原理是:首先從光源的角度觀察場(chǎng)景,把觀察到結(jié)果渲染到一個(gè)紋理,紋理中只保存
深度值(深度緩沖中的值)。這樣做的意義是,在紋理中保存了場(chǎng)景中的物體與光源之間的最短距離。然后從相機(jī)的角度進(jìn)行正常渲染場(chǎng)景,計(jì)算每個(gè)像素與光源的距離,并與紋理對(duì)應(yīng)的值進(jìn)行比較,如果大于,那么說(shuō)明它不是光線(xiàn)方向上離光源的最近的,會(huì)有陰影產(chǎn)生。/*可以有點(diǎn)疑惑,每個(gè)需要測(cè)試的像素如何與紋理中的像素一一對(duì)應(yīng)呢?還是按照生成紋理圖的原理,需要把測(cè)試頂點(diǎn)的位置坐標(biāo),轉(zhuǎn)換到光源為視點(diǎn)的空間,也就是說(shuō)從光源的角度,看看頂點(diǎn)應(yīng)該在哪里。這樣就可以一一對(duì)應(yīng)比較了。當(dāng)然這僅僅是為了比較的目的,真正渲染時(shí)頂點(diǎn)還是要先轉(zhuǎn)換到視空間中(從相機(jī)角度看)*/。
紋理陰影速度上要比模板陰影算法快,但因?yàn)殛幱氨讳秩镜郊y理中,而紋理具有確定的解析度,因此當(dāng)陰影被擴(kuò)展,拉伸時(shí),效果會(huì)較差,如產(chǎn)生鋸齒邊等。
因?yàn)槭褂昧思y理內(nèi)存,因此它的尺寸決定了紋理陰影數(shù)的上限。ogre中可以管理一幀中可以使用的陰影紋理數(shù):SceneManager::setShadowTextureCount()。每個(gè)光源都需要一個(gè)紋理。假如指定的紋理數(shù)少于光源數(shù),ogre采用”先來(lái)先服務(wù)“的原則分配紋理。假如不能增加紋理尺寸來(lái)提高視覺(jué)效果,最好減小投射陰影的距離。陰影不會(huì)突然終結(jié),ogre會(huì)淡化紋理陰影的邊緣阻止有陰影與無(wú)陰影之間劇烈過(guò)渡。可以控制淡化半徑。
Modulative陰影混合
正常場(chǎng)景渲染的顏色與陰影的顏色相乘來(lái)創(chuàng)建暗的、表示陰影的顏色。這種方法有從已經(jīng)渲染的場(chǎng)景中”減去“光照影響的效果。陰影區(qū)域一律變暗,與進(jìn)入陰影區(qū)的光線(xiàn)數(shù)無(wú)關(guān)。當(dāng)有多個(gè)光源產(chǎn)生的陰影區(qū)
重疊時(shí),陰影會(huì)非常暗,視覺(jué)效果很差。
Additive Shadow Masking
Modulative的方法是通過(guò)影響陰影區(qū)實(shí)現(xiàn)的。而Additive方法是只對(duì)處于光照中的區(qū)域有影響,對(duì)陰影區(qū)沒(méi)
有影響。這樣陰影區(qū)會(huì)受到別的光源的影響而變得稍亮,而相互重疊的陰影區(qū)也不會(huì)更暗。
ogre會(huì)把一個(gè)通道分為三個(gè)通道.
Ambietn,應(yīng)用環(huán)境光到場(chǎng)景中,在這個(gè)通道沒(méi)有紋理被渲染。
?Diffuse and specular, 這個(gè)通道對(duì)每個(gè)燈都渲染一次,當(dāng)前燈產(chǎn)生的陰影區(qū)域不受影響。其余的區(qū)域與場(chǎng)景進(jìn)行混合。同樣也不使用任何貼花紋理。
Decal。紋理被應(yīng)用到前面累積的顏色上。
?
posted on 2007-03-21 17:07
清源游民 閱讀(3087)
評(píng)論(0) 編輯 收藏 引用 所屬分類(lèi):
OGRE