|
|
* 地形纹理) N/ ]! w& K! M& q# R+ U
大概分两种类型:rts型和fps型
+ ?1 j. S& S9 ?5 Z. ?& \- d5 N
( [6 F# @3 D I- N' h: X**第一种:rts型。3 g6 D( I9 ?4 s, A' i
和二维做法差不多,把地图分为很多Block,每块Block可能又由m*n个Tile组成。每块Block使用一张纹理。适合rts等俯视类型游戏,《魔兽3》、《魔域帝国》用到。
1 K8 q! Q k- E+ @, K3 V优点:图像精细,适合表现细致的场景。
( i% A. f! N2 ]0 c! R缺点:渲染时纹理切换频繁。没法做大面积LOD(Level of Detail),LOD被限制在Block内。由于Block边缘顶点纹理坐标问题,导致Block间没法共用顶点。1 X, D1 [# Z& i" d- R! q
) r2 A4 o& A9 y1 R7 e% q) S; ?地貌间过渡处理: 如草地过渡到土地,简单的方法是让美术做好所有可能用到的不同地貌过渡的图片,程序计算拼接。复杂点的做法是程序计算纹理融合,在渲染是用多层纹理来解决过渡问题,《Empire Earth》,《C&C将军》使用类似做法。
1 t0 p# n1 V( v& e, _2 x- R1 [+ e5 T( P
特效处理:8 Y9 y' S. A) j& ^* a; e
水深效果:使用顶点色形成水下体积雾效果。1 d' |( d8 j) c% }9 M, h
4 |% ]& A" C# ^" u**第二种:fps型。
' Z) Q! \ M( [% A5 z4 I+ S整个地形用一张基本纹理(如:1024*1024)铺满,这张纹理是由程序计算生成(Terrain Texture Generation)。适合室外大场景游戏,如室外fps,飞行模拟。《Battle Field 1942》用到。5 c" P: d1 N& h. a" Z
优点:任意的LOD范围。无纹理切换问题。可以把计算好的地形LightMap融入基本纹理,一次渲染。
- X$ X% n- f3 [缺点:图像精度不够,解决方法是在渲染时上面加一层细节贴图,如:BumpMap,《Ground Control》用到。 M- `3 I, V0 r$ k& b. h% c& J0 v
0 A# k3 s+ F% E6 E9 |
*下面是一些常见的问题$ Y) O4 ?& t# ?1 L0 f
! z5 S4 ^& `- U0 W4 D$ [) f
**纹理生成计算方法
: E" g' U) Y" |* R/ M& X" I基本纹理每点像素由所处的海拔高度和坡度约束计算而得。可以理解为有一张横坐标为高度,纵坐标为坡度的纹理表,每点像素查表而来。资料见后。0 H) r5 u- [/ V& j N6 X" j
% u2 F# q& L9 H) V: n4 u**地形LightMap
( {+ [, m1 D, Y明暗(Shading):首先计算每个顶点的平均法向量,注意是共点平面的平均法向量,而不是某个面的法向量,然后用你的光照模型计算公式计算该点光照强度,如:I = cos<light,normal>*Isun + ambient。顶点间光照用插值计算,如法向插值phong算法。 M2 I/ @# ~. R4 Y' y8 f
阴影(Shadow):没看到太好的算法,一般光线求交算法速度太慢,目前我的想法是用硬件
+ x% P( _- h/ q9 O作ShadowVolume,渲染到一张纹理,然后保存。如果你有好的方法请告诉我。 P# c( w( K2 N0 C
* H, A. G$ h/ I5 l) D**物体阴影
) @: R E0 V8 v, C) J. R# o2 A/ W对静态物体,如房屋可事先渲染好融入Terrain LightMap。
3 c4 d2 R) z" c2 l对动态物体,可用Projection Shadow,简单说就是从光源方向把物体影子渲染到一张纹理,然后通过使用纹理坐标生成(TexCoordGen)和修改相应Texture Coordinates Matrix,把这张图贴到地面渲染。
$ n2 A3 F$ R( Y" X. m/ @/ o
T- x& l9 o1 {5 Y# Y**地形渲染
1 G4 O: Z% {1 N1 {用Indexed方式按块渲染,注意顶点提交顺序,增加GPU Vertex Cache命中率。如果有LOD,因为每次顶点数据是变化的,d3d实现时用Dynamic Vertex Buffer,把顶点放入AGP内存。6 R0 N% T( ~: Y( \# b8 h
- V7 L' u/ N. }5 V. N y3 Q**LOD(Level of Detail)
& R+ @' O% Z/ o5 y# X! g% KROAM算法不适合现代硬件加速显卡,不要用。
) _ Q8 F: a3 {可以看一下GeomMipMap LOD和T-Strip LOD。网址见后。1 J0 h1 G8 l4 l* }3 T' N+ z
8 x/ D. I4 @7 V1 \6 B" q) X**射线与地形求交算法& B, q5 G6 G) e! ^' t
把射线垂直投影到2d地面网格,顺着射线方向检测经过的每个格子,如果光线在格子里面的最低处大于格子四个顶点的最高处,则不可能有交点。
4 [7 L* ?) O; Q0 j5 O9 H g
8 I; \2 V: y& X8 t: F8 X$ x" V- i5 b资料:# U- B+ ?! l; F
T-Strip LOD: http://chat.carleton.ca/~eszoka/tstriplod/tstrip.htm% i( }; x- I7 i1 u& c
GeoMipMap LOD: http://www.flipcode.com/tutorials/geomipmaps.pdf) }0 }( l, _7 W& |( e
TerrainTextureGenerator(Full Source Code):http://www.insanesoftware.de/index.php?page=freetools/terrain.php) ~& F ?& ], C+ F
- M8 f% \, W9 H, p/ Gmy email: skull@hardcore3d.net |
|