天天看點

OGRE動态陰影

陰影技術

Ogre支援兩種主流的動态陰影技術,模闆(stencil)陰影與紋理(texture)陰影,每一種都有兩個變體:modulative 與additive。這四種技術完全相容固定函數圖形流水線,是以不需要可程式設計GPU支援。然而,可利用GPU程式進行加速。在場景中隻有使用一種陰影技術,應該在場景渲染這前進行陰影技術相關設定(最好是在建立場景管理器之間)。通過調用SceneManager::setShadowTechnique()來設定技術,參數指定技術的具體類型。陰影技術預設情況下被關閉。對于物體,投射與接收陰影可以在材質中控制,也可以控制物體自己對自己投射。由于模闆陰影算法的本質特征,透明半透明的物體要麼全部投射實心陰影要麼根本不投影影,不可能得到半透明的陰影。而使用紋理陰影技術則可以。燈不能用來投射陰影。

模闆陰影算法

模闆陰影算法原理上來講比較簡單:從光源的角度看一個可以投射陰影的物體,可以看到物體最外輪廓的

形狀,把這個輪廓沿光的方向延伸,形成一個空間體,就是所謂的陰影錐(shadow volume),很顯然,如果一

個物體被這個陰影錐包圍,那麼這個物體就處于前面那個物體所投射的陰影中了。既然陰影錐是通過延伸的方式來增長的,那麼可以在延伸方向對錐體的延伸範圍作出控制。在延伸方向上,有一端不能延伸,另外一端的延伸範圍控制按照下面兩個規則。第一,如果使用可程式設計圖形硬體,頂點程式可以對頂點進行無限延伸。第二,如果使用固定函數圖形流水線,延伸的範圍由光線衰減設定(點光源和聚光燈)或使用

SceneManager::setShadowDirectionalLightExtrusionDistance()來控制。在不使用加速圖形硬體的情況下,應該盡量避免物體離光源過近,這樣會産生過于寬的陰影錐,導緻不正确的陰影效果。根據算法原理,産生的陰影邊界非常明顯:一個像素要麼在陰影中,要麼不在。這帶來的好處是,即使陰影錐的延伸距離很大,也不會影響精度。可以講這種技術産生的陰影是一種“硬陰影"。紋理陰影技術可以”軟化“陰影。使用模闆陰影技術需要邊清單(edge lists),标準的轉換工具在産生二進制mesh檔案時會建立邊清單,如果沒有,在程式中也可以用Mesh::buildEdgeList()來産生。因為有時候,我們會代碼的方式來生成mesh,如果這時我們想使用模闆陰影技術,那麼就要確定産生出邊清單資料。如果邊清單資料不存在,那麼ogre會認為你不希望這個物體投射陰影。

模闆陰影優化

Ogre能進行一些一般的優化。例如可使用硬體加速,可能通過光的方向與範圍來檢測它是否會對平截頭體

(frustum)産生影響,從面避免了計算那些不必要的陰影幾何體。ogre支援雙面模闆,stencil-wrapping擴充,

這些都能阻止不必要的原型安裝(primitive setup)與驅動過載(driver overhead)。ogre使用相對廉價的Z-pass算法代替Z-Fail算法(當Z-Fail算法不必要時,假如相機處于一個陰影錐中,使用Z-pass算法會有問題,這種情況下應該使用Z-fail算法)。

陰影錐不受封閉幾何的影響。在下圖中,

OGRE動态陰影

衛兵投射到地闆上,投射的範圍内有個封閉的箱子(此例中設定箱子不投射陰影)。根據現實世界的經驗,箱子上會有衛兵投射的陰影,如圖中所示。但光線經過箱子阻擋後應該不再前進,也就是說陰影錐經過箱子阻擋後不應該延伸了,于是箱子後面的地闆上不應該再出現衛兵的陰影(真實世界中出現箱子的陰影,但是此例設定箱子不産生陰影)。圖中的地闆上出現了衛兵投射的陰影,這說明了陰影不會受到延伸方向上物體的影響。

在螢幕上看不到的物體也可以把陰影投影到可視的平截頭體(view frustum)中。雖然看不到,但是這些物體

也必須得被渲染,渲染他們純粹是為了得到産生陰影的相關資料。在不使用硬體加速的情況下,盡量避免物體離光源過近。

紋理陰影

紋理陰影算法的基本原理是:首先從光源的角度觀察場景,把觀察到結果渲染到一個紋理,紋理中隻儲存

深度值(深度緩沖中的值)。這樣做的意義是,在紋理中儲存了場景中的物體與光源之間的最短距離。然後從相機的角度進行正常渲染場景,計算每個像素與光源的距離,并與紋理對應的值進行比較,如果大于,那麼說明它不是光線方向上離光源的最近的,會有陰影産生。。

紋理陰影速度上要比模闆陰影算法快,但因為陰影被渲染到紋理中,而紋理具有确定的解析度,是以當陰影被擴充,拉伸時,效果會較差,如産生鋸齒邊等。

因為使用了紋理記憶體,是以它的尺寸決定了紋理陰影數的上限。ogre中可以管理一幀中可以使用的陰影紋理數:SceneManager::setShadowTextureCount()。每個光源都需要一個紋理。假如指定的紋理數少于光源數,ogre采用”先來先服務“的原則配置設定紋理。假如不能增加紋理尺寸來提高視覺效果,最好減小投射陰影的距離。陰影不會突然終結,ogre會淡化紋理陰影的邊緣阻止有陰影與無陰影之間劇烈過渡。可以控制淡化半徑。

Modulative陰影混合

正常場景渲染的顔色與陰影的顔色相乘來建立暗的、表示陰影的顔色。這種方法有從已經渲染的場景中”減去“光照影響的效果。陰影區域一律變暗,與進入陰影區的光線數無關。當有多個光源産生的陰影區

重疊時,陰影會非常暗,視覺效果很差。

Additive Shadow Masking

Modulative的方法是通過影響陰影區實作的。而Additive方法是隻對處于光照中的區域有影響,對陰影區沒

有影響。這樣陰影區會受到别的光源的影響而變得稍亮,而互相重疊的陰影區也不會更暗。

ogre會把一個通道分為三個通道.

Ambietn,應用環境光到場景中,在這個通道沒有紋理被渲染。

 Diffuse and specular, 這個通道對每個燈都渲染一次,目前燈産生的陰影區域不受影響。其餘的區域與場景進行混合。同樣也不使用任何貼花紋理。

Decal。紋理被應用到前面累積的顔色上。

繼續閱讀