|
|
* 地形纹理6 P" c, F/ J& D7 r! X
大概分两种类型:rts型和fps型: r: j& \# h- T" L2 I+ {. z
5 Q2 }5 }$ L6 Y+ s. D, W. q**第一种:rts型。
+ d1 s6 y* a- V+ B1 m' Z和二维做法差不多,把地图分为很多Block,每块Block可能又由m*n个Tile组成。每块Block使用一张纹理。适合rts等俯视类型游戏,《魔兽3》、《魔域帝国》用到。& p- ]2 ?, g, X" I
优点:图像精细,适合表现细致的场景。/ a0 Z/ U7 C9 {2 E+ c6 B
缺点:渲染时纹理切换频繁。没法做大面积LOD(Level of Detail),LOD被限制在Block内。由于Block边缘顶点纹理坐标问题,导致Block间没法共用顶点。4 w$ P9 u4 V5 E. }1 j
$ p6 W4 x. ?) o, B" P. }) R8 t; I
地貌间过渡处理: 如草地过渡到土地,简单的方法是让美术做好所有可能用到的不同地貌过渡的图片,程序计算拼接。复杂点的做法是程序计算纹理融合,在渲染是用多层纹理来解决过渡问题,《Empire Earth》,《C&C将军》使用类似做法。
$ Z/ @2 m' j. {- \0 S$ p3 ^/ c2 H+ Y! I$ y& o4 ~
特效处理:
5 C; v! G' G/ z) y水深效果:使用顶点色形成水下体积雾效果。
* Q+ }0 z, z4 o. j X: C$ Q1 S$ F5 O' @1 N
! e+ X: }4 o' U- D! m**第二种:fps型。% k" o+ ?( D# O* L# ?9 I+ j1 n
整个地形用一张基本纹理(如:1024*1024)铺满,这张纹理是由程序计算生成(Terrain Texture Generation)。适合室外大场景游戏,如室外fps,飞行模拟。《Battle Field 1942》用到。
) ?% J. |1 ~$ I优点:任意的LOD范围。无纹理切换问题。可以把计算好的地形LightMap融入基本纹理,一次渲染。) d7 P3 F& e$ V/ Y' @
缺点:图像精度不够,解决方法是在渲染时上面加一层细节贴图,如:BumpMap,《Ground Control》用到。. G3 K) n, J' M7 T7 t. z& Z
6 r$ b4 z% S& F: N*下面是一些常见的问题
x( Z& l4 G5 J4 f: J9 T$ O! i s( r% T, b$ M$ f, _/ \# f3 j) N4 ?$ W1 n: c
**纹理生成计算方法
7 {- t' @) f, K8 ~1 `基本纹理每点像素由所处的海拔高度和坡度约束计算而得。可以理解为有一张横坐标为高度,纵坐标为坡度的纹理表,每点像素查表而来。资料见后。
2 M3 I' ?" p" P" M+ ~) r u* Q+ S- K, G: u" v+ ~
**地形LightMap& Y8 d* c9 d' l- q
明暗(Shading):首先计算每个顶点的平均法向量,注意是共点平面的平均法向量,而不是某个面的法向量,然后用你的光照模型计算公式计算该点光照强度,如:I = cos<light,normal>*Isun + ambient。顶点间光照用插值计算,如法向插值phong算法。
! ^6 n" `! h, a, ]; U阴影(Shadow):没看到太好的算法,一般光线求交算法速度太慢,目前我的想法是用硬件' }. f- l' U; c4 V5 E
作ShadowVolume,渲染到一张纹理,然后保存。如果你有好的方法请告诉我。
+ ~) d' ^2 O3 ]& A) i
$ v) K/ d& j% g- b**物体阴影, u) p$ Z& p: A+ p2 Q) @
对静态物体,如房屋可事先渲染好融入Terrain LightMap。$ h3 @1 ]+ j* G" {3 O: V9 _, s U
对动态物体,可用Projection Shadow,简单说就是从光源方向把物体影子渲染到一张纹理,然后通过使用纹理坐标生成(TexCoordGen)和修改相应Texture Coordinates Matrix,把这张图贴到地面渲染。
" [$ c* C- D) Z3 x# N; n: N. H m; V+ j7 G$ C' l+ y
**地形渲染
* h# O: ^# r3 N( f. j用Indexed方式按块渲染,注意顶点提交顺序,增加GPU Vertex Cache命中率。如果有LOD,因为每次顶点数据是变化的,d3d实现时用Dynamic Vertex Buffer,把顶点放入AGP内存。
. o2 o7 W8 c% h' V# g7 Y! t% z- v6 Q2 a) J
**LOD(Level of Detail)
$ A# \7 @8 ~' p" u BROAM算法不适合现代硬件加速显卡,不要用。
5 G, E$ U9 _7 s) Q可以看一下GeomMipMap LOD和T-Strip LOD。网址见后。
: F: [# P. P4 M5 ]' h$ b- M1 p( O3 h3 H
**射线与地形求交算法
3 C1 F D$ F" r1 w把射线垂直投影到2d地面网格,顺着射线方向检测经过的每个格子,如果光线在格子里面的最低处大于格子四个顶点的最高处,则不可能有交点。
! ]: D: x2 Q: M/ N5 ?+ @! D
/ I5 u4 ]$ R) Q/ U6 U资料:$ m5 c! n/ Q W5 A; P" m( P" ^
T-Strip LOD: http://chat.carleton.ca/~eszoka/tstriplod/tstrip.htm
- H- e |: V% x+ ?GeoMipMap LOD: http://www.flipcode.com/tutorials/geomipmaps.pdf
& ~1 _- { ?* G5 Y3 STerrainTextureGenerator(Full Source Code):http://www.insanesoftware.de/index.php?page=freetools/terrain.php( M# |; R- B$ Q
- ~; N" [" e8 y' G# ]( w5 l3 ^1 emy email: skull@hardcore3d.net |
|