|
|
* 地形纹理( N- P. X! a/ b1 A( m$ K+ a. C- _
大概分两种类型:rts型和fps型
2 T% V3 C r" q6 c+ I4 E' Q. |+ M# z& U, d- n% S; ~" W9 `
**第一种:rts型。% m1 g9 D5 M0 e
和二维做法差不多,把地图分为很多Block,每块Block可能又由m*n个Tile组成。每块Block使用一张纹理。适合rts等俯视类型游戏,《魔兽3》、《魔域帝国》用到。, o7 r5 ~4 T% L3 G E
优点:图像精细,适合表现细致的场景。! @7 B x7 N* L
缺点:渲染时纹理切换频繁。没法做大面积LOD(Level of Detail),LOD被限制在Block内。由于Block边缘顶点纹理坐标问题,导致Block间没法共用顶点。1 E+ f5 d* x) q* O$ b
* A$ Y4 M& ~: j8 t9 U' \$ F
地貌间过渡处理: 如草地过渡到土地,简单的方法是让美术做好所有可能用到的不同地貌过渡的图片,程序计算拼接。复杂点的做法是程序计算纹理融合,在渲染是用多层纹理来解决过渡问题,《Empire Earth》,《C&C将军》使用类似做法。+ ?4 {, @/ }$ Z" K1 j
7 t7 o# D$ v7 w @; y( A5 T特效处理:0 u( B2 p; J/ @' _0 e0 p. z
水深效果:使用顶点色形成水下体积雾效果。9 o+ f. [5 \: |
2 W3 Q6 `8 O- M( P
**第二种:fps型。/ Y% d7 B! \% x- C% M2 _# R
整个地形用一张基本纹理(如:1024*1024)铺满,这张纹理是由程序计算生成(Terrain Texture Generation)。适合室外大场景游戏,如室外fps,飞行模拟。《Battle Field 1942》用到。3 p+ X9 ]7 W0 I$ q+ Y R4 M9 J
优点:任意的LOD范围。无纹理切换问题。可以把计算好的地形LightMap融入基本纹理,一次渲染。+ c# `' P/ o% U _- o* I
缺点:图像精度不够,解决方法是在渲染时上面加一层细节贴图,如:BumpMap,《Ground Control》用到。: S; y8 D3 c4 d& Y! G
# y* {) h- s8 h9 M
*下面是一些常见的问题+ R& c, f0 d2 d9 }. t1 }
- K b4 h9 m& k9 }! ?
**纹理生成计算方法
: _ @( g- P4 [/ g! v, m# p# Q基本纹理每点像素由所处的海拔高度和坡度约束计算而得。可以理解为有一张横坐标为高度,纵坐标为坡度的纹理表,每点像素查表而来。资料见后。
?) \( g0 Y! ?; `: Z
3 q |8 m2 H, v/ K**地形LightMap
. r1 g! }. m8 v+ U+ Q/ T9 Q4 H明暗(Shading):首先计算每个顶点的平均法向量,注意是共点平面的平均法向量,而不是某个面的法向量,然后用你的光照模型计算公式计算该点光照强度,如:I = cos<light,normal>*Isun + ambient。顶点间光照用插值计算,如法向插值phong算法。9 u5 ~4 J4 I& _% ^% ?4 Z6 L9 U: _7 a& e3 J& Q
阴影(Shadow):没看到太好的算法,一般光线求交算法速度太慢,目前我的想法是用硬件& ~( Y- R0 R* a/ n x: s
作ShadowVolume,渲染到一张纹理,然后保存。如果你有好的方法请告诉我。
7 s# C( q, A8 x! U* f+ b+ n/ k( I- X2 F
**物体阴影/ Q6 @( r; b, F8 r
对静态物体,如房屋可事先渲染好融入Terrain LightMap。/ C, C9 e( a$ G4 i. ~
对动态物体,可用Projection Shadow,简单说就是从光源方向把物体影子渲染到一张纹理,然后通过使用纹理坐标生成(TexCoordGen)和修改相应Texture Coordinates Matrix,把这张图贴到地面渲染。
2 ?4 C& z! C+ T. V+ a2 ]* M, a( c* I, c( @
**地形渲染& h- @8 ^. a! N) S8 I
用Indexed方式按块渲染,注意顶点提交顺序,增加GPU Vertex Cache命中率。如果有LOD,因为每次顶点数据是变化的,d3d实现时用Dynamic Vertex Buffer,把顶点放入AGP内存。- L3 f; S6 R& y: c$ ]4 s) e* T
' V6 v/ U# \; w+ B5 Q) J
**LOD(Level of Detail)( S) h( }. ]7 t6 X, F# L9 {4 R
ROAM算法不适合现代硬件加速显卡,不要用。- {! P& A" o; t M
可以看一下GeomMipMap LOD和T-Strip LOD。网址见后。
8 n- M: I0 k0 O' L+ D8 l4 L
4 l; h$ _7 d9 I9 f' _% O4 k**射线与地形求交算法! s V m: L$ d( c
把射线垂直投影到2d地面网格,顺着射线方向检测经过的每个格子,如果光线在格子里面的最低处大于格子四个顶点的最高处,则不可能有交点。9 t* T' C* |7 {6 Q# l
3 Y8 m6 W4 x O6 z8 ?% o2 W! X
资料:4 n6 V& S1 Y4 {7 T% Y8 o9 s9 z
T-Strip LOD: http://chat.carleton.ca/~eszoka/tstriplod/tstrip.htm, o C6 ^6 a# n2 g, f* r/ |: g
GeoMipMap LOD: http://www.flipcode.com/tutorials/geomipmaps.pdf: h# i, W- B" V9 r u
TerrainTextureGenerator(Full Source Code):http://www.insanesoftware.de/index.php?page=freetools/terrain.php. Z5 F5 F" w+ e4 m* D/ W
2 H" L- E1 e% L4 W
my email: skull@hardcore3d.net |
|