|
|
* 地形纹理
6 ?/ |4 i: ?7 H$ z* L& q大概分两种类型:rts型和fps型; _$ Q0 C0 E9 X$ x0 `7 o! M5 p1 e
6 H s7 o( U1 A
**第一种:rts型。% }2 X- B* G0 Y
和二维做法差不多,把地图分为很多Block,每块Block可能又由m*n个Tile组成。每块Block使用一张纹理。适合rts等俯视类型游戏,《魔兽3》、《魔域帝国》用到。
+ n' w8 W" u$ X: g; M y( t5 s& f优点:图像精细,适合表现细致的场景。+ N) p0 b9 J% j5 E( L @- @
缺点:渲染时纹理切换频繁。没法做大面积LOD(Level of Detail),LOD被限制在Block内。由于Block边缘顶点纹理坐标问题,导致Block间没法共用顶点。, K- k1 I) \! i( f
( Y. |% n2 ^' |
地貌间过渡处理: 如草地过渡到土地,简单的方法是让美术做好所有可能用到的不同地貌过渡的图片,程序计算拼接。复杂点的做法是程序计算纹理融合,在渲染是用多层纹理来解决过渡问题,《Empire Earth》,《C&C将军》使用类似做法。
- A' \/ ~# P ]5 \; T8 s
4 ^. M$ {/ k b; p2 U特效处理:+ f- R. h, m3 [' \$ K- _4 \
水深效果:使用顶点色形成水下体积雾效果。
% S. C! f2 d* f- ]- A7 m' l! E N0 S( o/ s' _* c
**第二种:fps型。& q/ K* v' \. f& ~3 p8 O
整个地形用一张基本纹理(如:1024*1024)铺满,这张纹理是由程序计算生成(Terrain Texture Generation)。适合室外大场景游戏,如室外fps,飞行模拟。《Battle Field 1942》用到。
/ b. w# r% Q7 } l优点:任意的LOD范围。无纹理切换问题。可以把计算好的地形LightMap融入基本纹理,一次渲染。- `% ]9 W$ }+ [/ N% S( B% p
缺点:图像精度不够,解决方法是在渲染时上面加一层细节贴图,如:BumpMap,《Ground Control》用到。; E& z7 u6 G. V; V
/ J& V7 e) S: j* s; ?. ]0 Q% ?7 |/ [
*下面是一些常见的问题
! F: \# C* k6 Z' b2 @. \! G6 \; V7 S% ]4 t# b. L
**纹理生成计算方法
; I7 d$ U2 r/ v基本纹理每点像素由所处的海拔高度和坡度约束计算而得。可以理解为有一张横坐标为高度,纵坐标为坡度的纹理表,每点像素查表而来。资料见后。6 a2 N! y8 ~$ b# y
* f4 D( Y' u" q/ M# h
**地形LightMap
# [, p2 w- o. _' `6 P明暗(Shading):首先计算每个顶点的平均法向量,注意是共点平面的平均法向量,而不是某个面的法向量,然后用你的光照模型计算公式计算该点光照强度,如:I = cos<light,normal>*Isun + ambient。顶点间光照用插值计算,如法向插值phong算法。
* z' K% p( Q: y阴影(Shadow):没看到太好的算法,一般光线求交算法速度太慢,目前我的想法是用硬件3 g# Z" P1 O1 O9 t# D$ x
作ShadowVolume,渲染到一张纹理,然后保存。如果你有好的方法请告诉我。4 {0 x# y: ]& b' k( F
V# F# n8 i: g- ?**物体阴影
+ U# }, `- ]% _; _+ ~对静态物体,如房屋可事先渲染好融入Terrain LightMap。: L: b8 n/ L) V; r* ?& v
对动态物体,可用Projection Shadow,简单说就是从光源方向把物体影子渲染到一张纹理,然后通过使用纹理坐标生成(TexCoordGen)和修改相应Texture Coordinates Matrix,把这张图贴到地面渲染。# j9 l3 L5 b$ y
1 K- Q' Z B% M' D**地形渲染! q8 s* n e0 I* i; p
用Indexed方式按块渲染,注意顶点提交顺序,增加GPU Vertex Cache命中率。如果有LOD,因为每次顶点数据是变化的,d3d实现时用Dynamic Vertex Buffer,把顶点放入AGP内存。+ k/ M- \0 ?8 J7 k* P
2 v W! R5 i; F6 ~( ^8 g0 p
**LOD(Level of Detail)( m5 T4 z! O/ s9 q" M+ s6 C5 B6 e
ROAM算法不适合现代硬件加速显卡,不要用。
^3 F/ e* y/ K1 B3 z% p可以看一下GeomMipMap LOD和T-Strip LOD。网址见后。) P; ]6 Q. m: ]2 p+ g% @
5 E* m% g% b& K; N( N( ~
**射线与地形求交算法
) t: |; {7 _, e3 O q把射线垂直投影到2d地面网格,顺着射线方向检测经过的每个格子,如果光线在格子里面的最低处大于格子四个顶点的最高处,则不可能有交点。
% V5 p1 @/ e2 A; s$ k% v; p* E( w- @
资料:
& N7 P( H6 Q/ m1 o5 [9 T4 O1 jT-Strip LOD: http://chat.carleton.ca/~eszoka/tstriplod/tstrip.htm3 y% J* m# M9 w& o# F1 J: u
GeoMipMap LOD: http://www.flipcode.com/tutorials/geomipmaps.pdf0 P5 c6 C. A- w! r! }2 T: q
TerrainTextureGenerator(Full Source Code):http://www.insanesoftware.de/index.php?page=freetools/terrain.php6 p8 f$ m( f1 C$ M
c, ?: \9 V' f: X1 c1 C9 ^0 R$ j/ Wmy email: skull@hardcore3d.net |
|