[转载]漫谈游戏中的阴影技术
學習啦~~~~~~
原文地址:漫談游戲中的陰影技術作者:flymemory隨著硬件的越來越高端化,各種以前可望而不可及的效果越來越多的應用到網(wǎng)絡游戲里。本篇文章是介紹目前游戲中影子的實現(xiàn)方式,它們的優(yōu)缺點以及應用的場合。
一般來說,在游戲中,應用比較多的影子技術有三種,Projective shadow, Shadow map以及Shadow map.我們接下來便依次的介紹它們。
Projective Shadow
?
投影的原理可以應用在任意貼圖上
?
就是我們通常所說的投射影子,它的實現(xiàn)比較簡單,具體有兩個步驟:
1.?以光源為視點,渲染有影子的物體到一張預備好的Shadow texture中。要注意的是,這里的渲染在計算投影的時候,需要把頂點從設備空間轉換到貼圖空間,以便于后面的貼圖。
2.?渲染被影子覆蓋到的物體,然后把影子覆蓋到物體上。這里是整個Projective shadow的最為關鍵的步驟。通過上面提供的Shadow Texture,可以使用一個PASS把受影子影響的物體渲染出來。也可以根據(jù)實際應用通過Blend,使用多個PASS來渲染。在渲染Shadow Texture的時候,需要API來為它生成最后的貼圖坐標。在DX中,你需要把D3DTSS_TEXCOORDINDEX設置成D3DTSS_TCI_CAMERASPACEPOSITION;同時把D3DTSS_TEXTURETRANSFORMFLAGS設置為D3DTTFF_PROJECTED。如果你使用OGL,可以把GL_TEXTURE_GEN_MODE設置GL_EYE_LINEAR, 同時設置紋理矩陣為投影紋理矩陣。
?
Projective Shadow原理簡單,實現(xiàn)方便,對于硬件配置的要求很低,效果也不錯。對于對影子效果要求不高的游戲來說,只需要不多的代碼就可以加入。但是由于Projective Shadow是需要計算能被影子投射到的對象,需要根據(jù)影子Caster來計算出它所對應的Receiver,這個步驟當場景對象過多的話會大量消耗CPU時間。同時,對于場景中物體渲染的管理也是對于實時應用的一個挑戰(zhàn),我們必須小心的管理物體渲染的層次關系。
?
Shadow Map
Shadow Map是一種成熟已久的技術,對于它的原理,很多初涉圖形學的愛好者都能夠很清晰的講出他的實現(xiàn)步驟。簡單來說,它是一種基于圖像空間的技術。首先它需要根據(jù)光源的位置作為視點把整個場景渲染出來以得到它們相對于光源的深度信息,然后再使用這些深度信息去決定場景中哪一個部分是處于陰影之中的。
??????????????????????????????????????????
判斷點是否處在陰影中
?
標準的Shadow Map,在DX SDK中你就能找到它的例子,看起來它的實現(xiàn)也并不復雜。但不幸的是它的作用也只是停留在能夠教學。換句話說,它一點都不實用,即使在例子中,你也能很容易的發(fā)現(xiàn)它的缺點。
首先它的精度不夠,雖然DX的例子還能看得過去,但由于Shadow Map是基于整個場景來渲染的,也就是說,它會用一張貼圖來渲染整個場景的影子。這樣來說,用于存儲信息的貼圖大小就直接影響到影子的質(zhì)量。小場景還勉強能夠應付,但只需要碰到稍大的場景,影子就有可能出現(xiàn)很嚴重的鋸齒,影響到影子的質(zhì)量。另外深度緩沖的精度也是難于解決的,特別是當影子的Caster和Receiver很接近的時候,Z-Fighting的情況發(fā)生得非常明顯。
當然Shadow Map也有自己的優(yōu)點,實現(xiàn)方便,效率較高,易于理解等,尤其是由于它是基于圖像空間的一項技術,可以用不大的代價就實現(xiàn)軟陰影的效果。所以近些年來,很多圖形學的學者也基于Shadow Map的原理提出了很多改進型的算法,Shadow Map也越來越多的應用到了大型的游戲中。我們要介紹的也是一種Shadow Map很重要的改進算法的思想――Perspective Shadow Map(PSM),需要注意的是,這種思想的本身也是不盡完美的。但是以它為主導思想,近些年來提出了不少新型的算法。
PSM是在當前攝像機的透視后的空間中計算中,用傳統(tǒng)圖形學的說法,就是歸一化后的設備空間中計算的。它的基本想法是首先把場景映射到Post-perspective空間中,然后在這個空間中通過把變換后的光源轉換到一個歸一化空間里生成一個標準的Shadow map。
如下圖,S是場景Bounding,L光產(chǎn)生的視錐,V是視錐,而M包含了所有從V到L的涉嫌。這個算法比較關鍵的是最后能夠生成下圖中黃色的區(qū)域H,H包含了所有Shadow Map所需要包含的空間。這也是生成Post-Perspective空間的最小Bounding。
?
有了Bounding之后, Post-Perspective空間的視點就很容易得到了。
根據(jù)以上的計算得到Post-Perspective空間的矩陣之后。其他的步驟就和標準的Shadow Map是一致的了。
標準的Shadow Map
Perspective Shadow Map
?
同樣的視點,同樣的貼圖大小,使用PSM我們可以得到更加細致的效果。
但PSM也有一些缺陷,比如說影子的質(zhì)量比較依賴視點,影子近處和遠處所得到的Z分布差異過大等。近些年提出的TSM,LISPSM都基于PSM的原理使得這些問題得到了一些改進,也使得Shadow map更多的使用到游戲中。
Shadow Volume
Shadow Volumes技術是一種基于幾何形體的技術,它需要幾何體在一定方向的燈光下的輪廓去產(chǎn)生一個封閉的容積,然后通過光線的投射就可以決定場景的陰影部分(通常來說使用模板緩沖去模擬光線的投射)。
這種技術最大的優(yōu)點就是影子可以精確到像素級別。影子的效果會很細致。但它也有一些缺點,首先對幾何體有一定的要求(必須是閉合的),同時對于效率的損耗也非常大(高填充率)。
為了構造陰影體,我們需要從燈光的位置引出通過要投射影子物體的每個頂點,這些投射的射線組成了一個封閉的體積,任何處于這個體積中的點我們便可以認為它是被陰影覆蓋。反之,處于體積之外的點便是處于光照中的。
?
處于陰影體中的物體才會接收到影子
?
通常來說,判斷物體是否處在陰影中有兩種基本算法:Z-PASS和Z-FAIL。簡單來說Z-PASS算法是從視點引一條射線,當射線進入陰影體的時候,stencil加1,當射線出陰影體的時候,stencil就減1。這樣的話,如果stencil的值在計算完成后為0,就代表物體不處在陰影中。對于Z-Fail算法,不同的是在渲染陰影體的時候,對于back face和front face的情況做了一些特殊的判斷,當對于back face 的Z test失敗的時候,stencil值加1,而對于front face的Z test失敗的時候,stencil值減1。
對于構建Shadow volume來說,找出物體的輪廓線很重要。基本的思想就是找出所有朝向相反的兩個三角形的共享邊,最終組成整個物體的輪廓。
?
總結
本文講解了目前主流的幾種生成陰影的方式。總體來說,各自都有應用的場合。Projective shadow比較適合應用在對效率要求比較高,對影子要求不是完全真實的場景中。Shadow map比較適合用于場景中靜態(tài)物體的影子渲染,它也能實現(xiàn)比較柔和的軟陰影。而Shadow Volume更適合于場景中的動態(tài)物體,比如說角色,怪物,風車等。大家可以根據(jù)自己具體項目的特點和需求來選擇合適的技術。
總結
以上是生活随笔為你收集整理的[转载]漫谈游戏中的阴影技术的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Silverlight 5 RC新特性探
- 下一篇: (转)IIS7 配置ASP.NET 2.