|
|
* 地形纹理; F. [; h# B+ y; D3 T% R& t; F% j
大概分两种类型:rts型和fps型5 [7 h; F8 V$ V% } Z! o
. k) |. {/ ^, t; z p6 {**第一种:rts型。" H8 F' A3 T' [" v) k2 I O" x: B
和二维做法差不多,把地图分为很多Block,每块Block可能又由m*n个Tile组成。每块Block使用一张纹理。适合rts等俯视类型游戏,《魔兽3》、《魔域帝国》用到。) T2 ^) N$ q' g0 V W
优点:图像精细,适合表现细致的场景。
4 u, O+ g3 R7 F缺点:渲染时纹理切换频繁。没法做大面积LOD(Level of Detail),LOD被限制在Block内。由于Block边缘顶点纹理坐标问题,导致Block间没法共用顶点。
]/ ~. r# K0 F0 A
2 w( L9 ~' D2 k" C6 ~3 v地貌间过渡处理: 如草地过渡到土地,简单的方法是让美术做好所有可能用到的不同地貌过渡的图片,程序计算拼接。复杂点的做法是程序计算纹理融合,在渲染是用多层纹理来解决过渡问题,《Empire Earth》,《C&C将军》使用类似做法。5 J0 k2 k. o, |$ o
Q% C9 L: o& P* v1 {特效处理:! U; v8 L5 T' |4 h: v
水深效果:使用顶点色形成水下体积雾效果。
2 _' m0 y% L! w' D# p- s$ {! M( L; ?0 K9 n
**第二种:fps型。
2 V' W: s4 w5 w" B! ]/ x整个地形用一张基本纹理(如:1024*1024)铺满,这张纹理是由程序计算生成(Terrain Texture Generation)。适合室外大场景游戏,如室外fps,飞行模拟。《Battle Field 1942》用到。) g: |4 Y6 j- K2 B' d( Y+ t- c& a
优点:任意的LOD范围。无纹理切换问题。可以把计算好的地形LightMap融入基本纹理,一次渲染。
: _8 s2 K1 ~- K$ Y- j缺点:图像精度不够,解决方法是在渲染时上面加一层细节贴图,如:BumpMap,《Ground Control》用到。
8 w: o: {& v2 C$ Q$ B' w
/ X/ s; {2 g& r5 s9 `$ p8 `*下面是一些常见的问题
8 V3 ]* T2 q7 Z( M+ s2 q) ]% ]6 b: a* k1 Y8 d8 }
**纹理生成计算方法' C) Q7 C& m6 |
基本纹理每点像素由所处的海拔高度和坡度约束计算而得。可以理解为有一张横坐标为高度,纵坐标为坡度的纹理表,每点像素查表而来。资料见后。
7 S, D: s \/ U8 d m4 o1 ~5 S% |9 o; E5 M- Z) M
**地形LightMap
& l+ m8 Q- B5 c' L( M( |# Q9 L明暗(Shading):首先计算每个顶点的平均法向量,注意是共点平面的平均法向量,而不是某个面的法向量,然后用你的光照模型计算公式计算该点光照强度,如:I = cos<light,normal>*Isun + ambient。顶点间光照用插值计算,如法向插值phong算法。6 ?& P. p+ t3 ]
阴影(Shadow):没看到太好的算法,一般光线求交算法速度太慢,目前我的想法是用硬件" I$ Z7 I* z) P# y: `& Q
作ShadowVolume,渲染到一张纹理,然后保存。如果你有好的方法请告诉我。
6 P$ z" w: s+ `- G' O6 r9 `1 R ?2 C" a8 m* |. B/ k
**物体阴影
+ V; O) Y: z3 F1 i. Y5 a3 p# o对静态物体,如房屋可事先渲染好融入Terrain LightMap。$ C+ w$ [% i6 t; J" O
对动态物体,可用Projection Shadow,简单说就是从光源方向把物体影子渲染到一张纹理,然后通过使用纹理坐标生成(TexCoordGen)和修改相应Texture Coordinates Matrix,把这张图贴到地面渲染。
( E [* [) \0 |7 ]) X* A- N: ]
. n, H; P! q2 _**地形渲染& Z! \: p0 H: q: {- B0 l
用Indexed方式按块渲染,注意顶点提交顺序,增加GPU Vertex Cache命中率。如果有LOD,因为每次顶点数据是变化的,d3d实现时用Dynamic Vertex Buffer,把顶点放入AGP内存。5 o5 V" G/ h% i3 r
, t' T# U9 b# _5 s5 g9 W
**LOD(Level of Detail)
1 J/ C/ M7 F7 ?% W, c- i: a1 C; sROAM算法不适合现代硬件加速显卡,不要用。
- B3 U; h( W# d, `可以看一下GeomMipMap LOD和T-Strip LOD。网址见后。
8 e/ F2 I1 G* k: W9 M1 u2 o2 o N' y# W/ K7 k4 l6 |
**射线与地形求交算法
& C7 m& _% P$ R. |, i8 g$ S: Q( }4 s把射线垂直投影到2d地面网格,顺着射线方向检测经过的每个格子,如果光线在格子里面的最低处大于格子四个顶点的最高处,则不可能有交点。( }, O5 R$ ^8 `5 G
( C3 m# i9 X% Q+ E& c! @, X资料:. \3 t- E0 E& x" L4 z# k. c
T-Strip LOD: http://chat.carleton.ca/~eszoka/tstriplod/tstrip.htm( ?9 n) N7 T" W1 M4 F+ J
GeoMipMap LOD: http://www.flipcode.com/tutorials/geomipmaps.pdf; K* D( Y3 x3 @6 G$ a/ z
TerrainTextureGenerator(Full Source Code):http://www.insanesoftware.de/index.php?page=freetools/terrain.php
1 B7 x0 |; X& r6 t' N) m* R3 w# ]: Y1 C' d
my email: skull@hardcore3d.net |
|