|
|
* 地形纹理3 v, S) v5 ~7 A7 p
大概分两种类型:rts型和fps型
/ T$ q6 f% L' O+ k4 \% n6 a0 t9 y6 g" A1 g, t3 N9 C
**第一种:rts型。
4 c' w( ?. E4 W! S和二维做法差不多,把地图分为很多Block,每块Block可能又由m*n个Tile组成。每块Block使用一张纹理。适合rts等俯视类型游戏,《魔兽3》、《魔域帝国》用到。5 k, o0 ?0 ^0 x2 o9 J \5 B$ L0 E
优点:图像精细,适合表现细致的场景。. {; i$ J8 I. [) `
缺点:渲染时纹理切换频繁。没法做大面积LOD(Level of Detail),LOD被限制在Block内。由于Block边缘顶点纹理坐标问题,导致Block间没法共用顶点。# J2 M% n/ K) l1 l6 @- n
9 j6 e* ^% S+ P4 u' q0 j. F+ |6 x# \- ]地貌间过渡处理: 如草地过渡到土地,简单的方法是让美术做好所有可能用到的不同地貌过渡的图片,程序计算拼接。复杂点的做法是程序计算纹理融合,在渲染是用多层纹理来解决过渡问题,《Empire Earth》,《C&C将军》使用类似做法。$ t4 _8 E* w1 Y$ I, M7 Z* S- |
8 O2 @1 S! Q( q& ^' w) J! h0 U特效处理:) _ N5 U) C& C/ S2 j' J9 X
水深效果:使用顶点色形成水下体积雾效果。
1 M6 m0 Y: ]( [0 [. Q E6 a1 ?) W
**第二种:fps型。" P; y! [3 K+ o2 J1 x
整个地形用一张基本纹理(如:1024*1024)铺满,这张纹理是由程序计算生成(Terrain Texture Generation)。适合室外大场景游戏,如室外fps,飞行模拟。《Battle Field 1942》用到。' U4 b% b0 P$ h# D6 t8 z K
优点:任意的LOD范围。无纹理切换问题。可以把计算好的地形LightMap融入基本纹理,一次渲染。 u7 @% E$ b$ l6 {, W
缺点:图像精度不够,解决方法是在渲染时上面加一层细节贴图,如:BumpMap,《Ground Control》用到。
7 @# {* a; { b5 C% _# w: Z
8 x$ l! Z' d0 {*下面是一些常见的问题% ^# |1 I- v6 ?3 a. A& n) l
- P- h* U9 K: ]9 M( N! ^**纹理生成计算方法 A s5 Z0 e; I. J1 P
基本纹理每点像素由所处的海拔高度和坡度约束计算而得。可以理解为有一张横坐标为高度,纵坐标为坡度的纹理表,每点像素查表而来。资料见后。
w9 f* _3 y* k, f; g8 ?7 L
9 R3 K# E+ \. l2 q+ E**地形LightMap
4 [- o5 Y ]8 x0 L' N* h' j明暗(Shading):首先计算每个顶点的平均法向量,注意是共点平面的平均法向量,而不是某个面的法向量,然后用你的光照模型计算公式计算该点光照强度,如:I = cos<light,normal>*Isun + ambient。顶点间光照用插值计算,如法向插值phong算法。+ l4 q: O- w1 ?5 z5 u2 N6 }
阴影(Shadow):没看到太好的算法,一般光线求交算法速度太慢,目前我的想法是用硬件
/ F" v$ b# G, `3 o! @作ShadowVolume,渲染到一张纹理,然后保存。如果你有好的方法请告诉我。
/ f9 a' R7 M9 ~4 Z$ x- ?
0 }- P' K% m) |, Z( T1 g**物体阴影# M( J% E1 S5 s% |& ?3 m
对静态物体,如房屋可事先渲染好融入Terrain LightMap。- U# a; j; i8 T1 E9 p9 O
对动态物体,可用Projection Shadow,简单说就是从光源方向把物体影子渲染到一张纹理,然后通过使用纹理坐标生成(TexCoordGen)和修改相应Texture Coordinates Matrix,把这张图贴到地面渲染。$ g6 f" W2 C }) D0 O& s
& C" s8 |/ h+ j8 q& c: |5 D4 _
**地形渲染1 u0 T8 l2 {, O4 T
用Indexed方式按块渲染,注意顶点提交顺序,增加GPU Vertex Cache命中率。如果有LOD,因为每次顶点数据是变化的,d3d实现时用Dynamic Vertex Buffer,把顶点放入AGP内存。
1 {$ C2 Q& G. \* J; i/ G- B
( q, K' N9 W2 H* I1 f% S$ q**LOD(Level of Detail)! A" j7 \% [! W! O4 `
ROAM算法不适合现代硬件加速显卡,不要用。
/ `+ A! e% Q9 g可以看一下GeomMipMap LOD和T-Strip LOD。网址见后。
( O8 K' s1 e7 P6 f5 N" T
8 Z4 V/ f* h3 _8 k4 F3 Q, G' H**射线与地形求交算法; G2 R, a* z! o, `
把射线垂直投影到2d地面网格,顺着射线方向检测经过的每个格子,如果光线在格子里面的最低处大于格子四个顶点的最高处,则不可能有交点。
: v" n k* i! T7 d( o6 ~2 ?4 U
: \" a$ v3 {7 i, C资料:& S* w* s) { y
T-Strip LOD: http://chat.carleton.ca/~eszoka/tstriplod/tstrip.htm# z9 U. a/ y! ?9 y/ A* R5 e
GeoMipMap LOD: http://www.flipcode.com/tutorials/geomipmaps.pdf3 G. d( f( a* E3 W7 B7 J+ }& b! h9 V
TerrainTextureGenerator(Full Source Code):http://www.insanesoftware.de/index.php?page=freetools/terrain.php' l; R* X/ s, f) o4 L& s2 }
k3 u/ J+ {2 [* E! e9 Y/ K+ Rmy email: skull@hardcore3d.net |
|