|
* 地形纹理* b% K& Q. w7 N) e! p& Q; S. J
大概分两种类型:rts型和fps型8 S6 x5 w- D) T/ H' O0 A) y. G
+ P+ g6 \& r% m Q# B) H" X4 A6 `
**第一种:rts型。
/ |' {" f& k# X( l7 _8 g# s和二维做法差不多,把地图分为很多Block,每块Block可能又由m*n个Tile组成。每块Block使用一张纹理。适合rts等俯视类型游戏,《魔兽3》、《魔域帝国》用到。
# y: g& X/ s2 E优点:图像精细,适合表现细致的场景。% V5 l( K+ t7 U
缺点:渲染时纹理切换频繁。没法做大面积LOD(Level of Detail),LOD被限制在Block内。由于Block边缘顶点纹理坐标问题,导致Block间没法共用顶点。! }( W( Q3 W6 s1 ~
: C8 Y( D1 z9 y; B, Z, f6 M
地貌间过渡处理: 如草地过渡到土地,简单的方法是让美术做好所有可能用到的不同地貌过渡的图片,程序计算拼接。复杂点的做法是程序计算纹理融合,在渲染是用多层纹理来解决过渡问题,《Empire Earth》,《C&C将军》使用类似做法。
' @7 O8 j- l+ o$ r6 {" b% E6 }2 w: e3 M- H0 B$ s/ \% \
特效处理:
1 J2 w) n& s8 P% A) a7 S* W- E水深效果:使用顶点色形成水下体积雾效果。
& q4 B9 |4 A3 Q: B, k' b% }
: h& I/ R. L' |8 k: g2 \**第二种:fps型。) {1 k y/ ^/ x# K- X
整个地形用一张基本纹理(如:1024*1024)铺满,这张纹理是由程序计算生成(Terrain Texture Generation)。适合室外大场景游戏,如室外fps,飞行模拟。《Battle Field 1942》用到。
0 t6 c3 Q L* f优点:任意的LOD范围。无纹理切换问题。可以把计算好的地形LightMap融入基本纹理,一次渲染。
6 l% a: L8 ~: ^' H' ~4 B" k3 Z" t; s' \缺点:图像精度不够,解决方法是在渲染时上面加一层细节贴图,如:BumpMap,《Ground Control》用到。" {- n8 ~" e8 k Y. r
2 w9 S6 Q' v$ N, \- D: Y*下面是一些常见的问题
0 H' V6 Z) G# L* k4 o5 M* e: D* z
**纹理生成计算方法+ ]9 y/ ?4 @4 O0 V: T; j6 L
基本纹理每点像素由所处的海拔高度和坡度约束计算而得。可以理解为有一张横坐标为高度,纵坐标为坡度的纹理表,每点像素查表而来。资料见后。5 w* x( G# h- j7 A$ |
% m, d1 ` c+ h( u4 c9 ^**地形LightMap
! z$ j' F1 w* q" j. U5 K: Q明暗(Shading):首先计算每个顶点的平均法向量,注意是共点平面的平均法向量,而不是某个面的法向量,然后用你的光照模型计算公式计算该点光照强度,如:I = cos<light,normal>*Isun + ambient。顶点间光照用插值计算,如法向插值phong算法。0 K9 h) \6 a2 S7 X5 K" |# i& @
阴影(Shadow):没看到太好的算法,一般光线求交算法速度太慢,目前我的想法是用硬件! n& E9 x% p" D' u' _2 ?5 ]
作ShadowVolume,渲染到一张纹理,然后保存。如果你有好的方法请告诉我。' }/ |9 w$ }% `
% R; L: @( Z, P+ {4 F# V W( ~ j& P
**物体阴影
( f* `, Q- N: r' E `对静态物体,如房屋可事先渲染好融入Terrain LightMap。- H: d, b. U" s3 } B, C) R" g# C- X
对动态物体,可用Projection Shadow,简单说就是从光源方向把物体影子渲染到一张纹理,然后通过使用纹理坐标生成(TexCoordGen)和修改相应Texture Coordinates Matrix,把这张图贴到地面渲染。
" p6 t: c7 _' ?, }2 ]: C$ m V( v- y1 c& k9 D
**地形渲染
- W- H2 T& v3 l1 S! A% V" [用Indexed方式按块渲染,注意顶点提交顺序,增加GPU Vertex Cache命中率。如果有LOD,因为每次顶点数据是变化的,d3d实现时用Dynamic Vertex Buffer,把顶点放入AGP内存。
0 Y# P3 E- Z) v7 V- S
. L6 o" _1 O. E; d4 ?" ~**LOD(Level of Detail)2 v6 M/ c! r, Q$ W6 O2 [
ROAM算法不适合现代硬件加速显卡,不要用。
$ y1 m1 F+ r+ V+ L8 p可以看一下GeomMipMap LOD和T-Strip LOD。网址见后。8 I) @1 C( s! _6 `
( x- G g2 t2 G: S* q' s4 e6 s
**射线与地形求交算法
( b) i/ K1 F: q, n" V. I把射线垂直投影到2d地面网格,顺着射线方向检测经过的每个格子,如果光线在格子里面的最低处大于格子四个顶点的最高处,则不可能有交点。
8 a* Z2 P7 B0 l4 b5 W: B2 b) N2 Q& d% {! ]
资料:
% k9 j+ }" B T' e4 E aT-Strip LOD: http://chat.carleton.ca/~eszoka/tstriplod/tstrip.htm! ^4 {% Y! |; {* i' k+ }
GeoMipMap LOD: http://www.flipcode.com/tutorials/geomipmaps.pdf$ l# K- I5 J5 _0 W: b
TerrainTextureGenerator(Full Source Code):http://www.insanesoftware.de/index.php?page=freetools/terrain.php( [9 F7 Q* P) i) h: K
% y' O+ ^+ {" S2 ?4 F% |my email: skull@hardcore3d.net |
|