3D地形相關技術 (轉)

gugu99發表於2007-10-19
3D地形相關技術 (轉)[@more@]* 地形紋理
大概分兩種型別:rts型和fps型

**第一種:rts型。
和二維做法差不多,把地圖分為很多Block,每塊Block可能又由m*n個Tile組成。每塊Block使用一張紋理。適合rts等俯視型別遊戲,《魔獸3》、《魔域帝國》用到。
優點:影像精細,適合表現細緻的場景。
缺點:渲染時紋理切換頻繁。沒法做大面積LOD(Level of Detail),LOD被限制在Block內。由於Block邊緣頂點紋理座標問題,導致Block間沒法共用頂點。

地貌間過渡處理: 如草地過渡到土地,簡單的方法是讓美術做好所有可能用到的不同地貌過渡的圖片,計算拼接。複雜點的做法是程式計算紋理融合,在渲染是用多層紋理來解決過渡問題,《Empire Earth》,《C&C將軍》使用類似做法。

特效處理:
水深效果:使用頂點色形成水下體積霧效果。

**第二種:fps型。
整個地形用一張基本紋理(如:1024*1024)鋪滿,這張紋理是由程式計算生成(Terrain Texture Generation)。適合室外大場景遊戲,如室外fps,飛行模擬。《Battle Field 1942》用到。
優點:任意的LOD範圍。無紋理切換問題。可以把計算好的地形LightMap融入基本紋理,一次渲染。
缺點:影像精度不夠,解決方法是在渲染時上面加一層細節貼圖,如:BumpMap,《Ground Control》用到。

*下面是一些常見的問題

**紋理生成計算方法
基本紋理每點畫素由所處的海拔高度和坡度計算而得。可以理解為有一張橫座標為高度,縱座標為坡度的紋理表,每點畫素查表而來。資料見後。

**地形LightMap
明暗(Shading):首先計算每個頂點的平均法向量,注意是共點平面的平均法向量,而不是某個面的法向量,然後用你的光照模型計算公式計算該點光照強度,如:I = cos*Isun + ambient。頂點間光照用插值計算,如法向插值phong演算法。
陰影(Shadow):沒看到太好的演算法,一般光線求交演算法速度太慢,目前我的想法是用
作ShadowVolume,渲染到一張紋理,然後儲存。如果你有好的方法請告訴我。

**物體陰影
對靜態物體,如房屋可事先渲染好融入Terrain LightMap。
對動態物體,可用Projection Shadow,簡單說就是從光源方向把物體影子渲染到一張紋理,然後透過使用紋理座標生成(TexCoordGen)和修改相應Texture Coordinates Matrix,把這張圖貼到地面渲染。

**地形渲染
用Indexed方式按塊渲染,注意頂點提交順序,增加GPU Vertex Cache命中率。如果有LOD,因為每次頂點資料是變化的,d3d實現時用Dynamic Vertex Buffer,把頂點放入AGP。

**LOD(Level of Detail)
ROAM演算法不適合現代硬體加速,不要用。
可以看一下GeomMipMap LOD和T-StrLOD。網址見後。

**射線與地形求交演算法
把射線垂直投影到2d地面網格,順著射線方向檢測經過的每個格子,如果光線在格子裡面的最低處大於格子四個頂點的最高處,則不可能有交點。

資料:
T-Strip LOD: ~eszoka/tstriplod/tstrip.htm
GeoMipMap LOD:
TerrainTextureGenerator(Full Code):?page=freetools/terrain.php

my e: skull@hardcore3d

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-977629/,如需轉載,請註明出處,否則將追究法律責任。

相關文章