|
|
* 地形纹理
& S4 {2 t4 b1 A9 [大概分两种类型:rts型和fps型" f7 U1 T# M# a0 B; L
3 `7 X9 o" K' _0 {, I9 s3 G6 W; K
**第一种:rts型。" [$ o+ t" H/ ?
和二维做法差不多,把地图分为很多Block,每块Block可能又由m*n个Tile组成。每块Block使用一张纹理。适合rts等俯视类型游戏,《魔兽3》、《魔域帝国》用到。
% H- ^! w( }% B2 H! r优点:图像精细,适合表现细致的场景。8 Y3 j; s( f6 d3 a& i( o6 g
缺点:渲染时纹理切换频繁。没法做大面积LOD(Level of Detail),LOD被限制在Block内。由于Block边缘顶点纹理坐标问题,导致Block间没法共用顶点。) x& d' A! f* J; b' x, p8 Q
* X" e7 L+ w9 c; H
地貌间过渡处理: 如草地过渡到土地,简单的方法是让美术做好所有可能用到的不同地貌过渡的图片,程序计算拼接。复杂点的做法是程序计算纹理融合,在渲染是用多层纹理来解决过渡问题,《Empire Earth》,《C&C将军》使用类似做法。
: ?8 F( I5 \) D3 p; i2 J5 B; ^
0 D( |9 `5 _' K, _* j1 e特效处理:
# Q1 \/ `/ O8 F3 c* N9 s水深效果:使用顶点色形成水下体积雾效果。
" q, f! H6 R* ?$ f7 B6 j
6 e1 }0 P* R6 H**第二种:fps型。
- z& O6 ^6 } ^, z3 s/ m w整个地形用一张基本纹理(如:1024*1024)铺满,这张纹理是由程序计算生成(Terrain Texture Generation)。适合室外大场景游戏,如室外fps,飞行模拟。《Battle Field 1942》用到。* v7 T5 O2 v: Q+ Q9 E
优点:任意的LOD范围。无纹理切换问题。可以把计算好的地形LightMap融入基本纹理,一次渲染。
7 s* y+ e; j7 a" K' Z1 Q- m7 E缺点:图像精度不够,解决方法是在渲染时上面加一层细节贴图,如:BumpMap,《Ground Control》用到。
, N1 `* q/ i, P8 [; W3 z9 z `# f6 F
8 Y/ |2 |& G: B$ r*下面是一些常见的问题5 ? m; J- l$ m
- D" i0 e: f7 F0 u$ s
**纹理生成计算方法, b" C: Y+ D, b$ E4 J
基本纹理每点像素由所处的海拔高度和坡度约束计算而得。可以理解为有一张横坐标为高度,纵坐标为坡度的纹理表,每点像素查表而来。资料见后。2 u1 W* o. F! b- @, P8 @
2 e8 ^! Q, N% j
**地形LightMap
& M& C8 m1 Y* M明暗(Shading):首先计算每个顶点的平均法向量,注意是共点平面的平均法向量,而不是某个面的法向量,然后用你的光照模型计算公式计算该点光照强度,如:I = cos<light,normal>*Isun + ambient。顶点间光照用插值计算,如法向插值phong算法。
. K, ~& u& e! R& A: ]: ^1 v6 l2 \阴影(Shadow):没看到太好的算法,一般光线求交算法速度太慢,目前我的想法是用硬件( H% _, X5 G }
作ShadowVolume,渲染到一张纹理,然后保存。如果你有好的方法请告诉我。
" B. G) v( a( [( Z9 y. v3 |9 @- U$ x: m% ]
**物体阴影- ~8 E7 z3 l) C3 p" Z8 Z; t) T9 K9 S
对静态物体,如房屋可事先渲染好融入Terrain LightMap。
! g& Q2 [( w3 M6 d对动态物体,可用Projection Shadow,简单说就是从光源方向把物体影子渲染到一张纹理,然后通过使用纹理坐标生成(TexCoordGen)和修改相应Texture Coordinates Matrix,把这张图贴到地面渲染。! N7 D- w7 a) j8 v2 e5 v
[5 T# @! A) _**地形渲染" N8 ^4 v5 _- Y( x8 }7 I( o8 ?
用Indexed方式按块渲染,注意顶点提交顺序,增加GPU Vertex Cache命中率。如果有LOD,因为每次顶点数据是变化的,d3d实现时用Dynamic Vertex Buffer,把顶点放入AGP内存。6 V4 ^4 v! _# l) z$ O! n
6 {. e3 ?" K5 I. r3 l**LOD(Level of Detail)4 _1 y0 E% }+ \$ l% l& Y5 Q% R( H
ROAM算法不适合现代硬件加速显卡,不要用。0 C/ m6 ^! C( X
可以看一下GeomMipMap LOD和T-Strip LOD。网址见后。3 a2 v6 V" s- j* d |% _9 A
- r2 w0 J" H$ q Q3 S/ Y**射线与地形求交算法
' r: {. B& B% R把射线垂直投影到2d地面网格,顺着射线方向检测经过的每个格子,如果光线在格子里面的最低处大于格子四个顶点的最高处,则不可能有交点。
8 w3 m3 B, K. r. } Z x1 V# `- q X' v) E, }/ l! w
资料:
& A& G% H j3 x! ~T-Strip LOD: http://chat.carleton.ca/~eszoka/tstriplod/tstrip.htm
7 ^$ X8 `& |8 O. j+ BGeoMipMap LOD: http://www.flipcode.com/tutorials/geomipmaps.pdf
3 @7 z- r/ K4 Q# X! F: p7 ?TerrainTextureGenerator(Full Source Code):http://www.insanesoftware.de/index.php?page=freetools/terrain.php5 y" F( E6 ?; W! L- w% A! N) w
1 R8 i; X# R7 w. B0 f7 Zmy email: skull@hardcore3d.net |
|