|
|
* 地形纹理1 |' f2 f! D6 p& a8 l! g# Y
大概分两种类型:rts型和fps型8 O% k3 N' I# u. b* O" u( S
- Y& H- ~5 q) O$ l1 S+ U1 B- i**第一种:rts型。
6 D( B" G3 p3 I f: [9 y和二维做法差不多,把地图分为很多Block,每块Block可能又由m*n个Tile组成。每块Block使用一张纹理。适合rts等俯视类型游戏,《魔兽3》、《魔域帝国》用到。5 a( w* T7 o% r; e+ X* ^
优点:图像精细,适合表现细致的场景。
0 d- ]. H3 K0 E8 n1 c# L缺点:渲染时纹理切换频繁。没法做大面积LOD(Level of Detail),LOD被限制在Block内。由于Block边缘顶点纹理坐标问题,导致Block间没法共用顶点。. T1 C! O* E" F' j
" C0 J7 m3 ]$ w
地貌间过渡处理: 如草地过渡到土地,简单的方法是让美术做好所有可能用到的不同地貌过渡的图片,程序计算拼接。复杂点的做法是程序计算纹理融合,在渲染是用多层纹理来解决过渡问题,《Empire Earth》,《C&C将军》使用类似做法。( c7 j7 k( L- I; P# Q# p
; l: V9 K) Y+ p8 i [' S
特效处理:( m4 s# Z4 h% v& C1 B
水深效果:使用顶点色形成水下体积雾效果。
( E" z$ n) a! c) C& L- ~
( c+ ~/ W& t, }; S**第二种:fps型。9 L9 `6 c- L0 |
整个地形用一张基本纹理(如:1024*1024)铺满,这张纹理是由程序计算生成(Terrain Texture Generation)。适合室外大场景游戏,如室外fps,飞行模拟。《Battle Field 1942》用到。- g+ U% Q) g8 K) e: a- C! g2 {
优点:任意的LOD范围。无纹理切换问题。可以把计算好的地形LightMap融入基本纹理,一次渲染。
, a/ E1 Z+ h; S2 j) f% P6 K缺点:图像精度不够,解决方法是在渲染时上面加一层细节贴图,如:BumpMap,《Ground Control》用到。% a' Y. ~! p# V$ W* q" z
7 x! B7 i) E5 Y3 W
*下面是一些常见的问题( v! Y! I% R* [9 P+ h( T
6 l) B2 l; r: s0 Q**纹理生成计算方法
`1 a7 x4 ]4 F, E+ H n/ g4 J( V" \基本纹理每点像素由所处的海拔高度和坡度约束计算而得。可以理解为有一张横坐标为高度,纵坐标为坡度的纹理表,每点像素查表而来。资料见后。' T1 y% d! z; Q% z- t
3 O8 n9 r/ h& \
**地形LightMap
4 J* r( H1 {+ D) ?/ X% d4 S" ]$ r明暗(Shading):首先计算每个顶点的平均法向量,注意是共点平面的平均法向量,而不是某个面的法向量,然后用你的光照模型计算公式计算该点光照强度,如:I = cos<light,normal>*Isun + ambient。顶点间光照用插值计算,如法向插值phong算法。
6 Q- y0 \& y9 |' r0 I# S阴影(Shadow):没看到太好的算法,一般光线求交算法速度太慢,目前我的想法是用硬件
# I7 A- y% v+ c2 }, v, S3 w作ShadowVolume,渲染到一张纹理,然后保存。如果你有好的方法请告诉我。+ J# n" ?/ f! i. I- B. J& a
7 z# _9 R" [0 F& ]& X9 b
**物体阴影
; M' X3 B# C+ ^- Q; x对静态物体,如房屋可事先渲染好融入Terrain LightMap。$ \) n- O6 L" K0 {5 z# Q, Z5 {* H
对动态物体,可用Projection Shadow,简单说就是从光源方向把物体影子渲染到一张纹理,然后通过使用纹理坐标生成(TexCoordGen)和修改相应Texture Coordinates Matrix,把这张图贴到地面渲染。
% D7 R5 [; K% ^6 a; G5 ^6 c* v5 \% m3 q6 k
**地形渲染% z1 U [; ]( }2 f! k
用Indexed方式按块渲染,注意顶点提交顺序,增加GPU Vertex Cache命中率。如果有LOD,因为每次顶点数据是变化的,d3d实现时用Dynamic Vertex Buffer,把顶点放入AGP内存。
3 t% H) |& ^9 a. k# z* m$ i' e+ c( [% w0 K$ j5 N" H* D# l. ~$ F
**LOD(Level of Detail)4 \# @4 U7 \, t0 l Y' P- H
ROAM算法不适合现代硬件加速显卡,不要用。: P5 K m! u1 a1 b7 P% K5 e5 [
可以看一下GeomMipMap LOD和T-Strip LOD。网址见后。% k4 ^8 P1 u: Q/ k
( q+ V6 u" p) t6 p' W0 R
**射线与地形求交算法% ?1 I; J! d9 F4 s
把射线垂直投影到2d地面网格,顺着射线方向检测经过的每个格子,如果光线在格子里面的最低处大于格子四个顶点的最高处,则不可能有交点。# S, ~. ]/ T' C A6 S4 W' z% K
' C; R8 w% r2 w2 y5 V
资料:
: `! y- g& X# c% z$ yT-Strip LOD: http://chat.carleton.ca/~eszoka/tstriplod/tstrip.htm
1 L2 G6 U: ^. |0 f' u6 YGeoMipMap LOD: http://www.flipcode.com/tutorials/geomipmaps.pdf
- x( E- B% [: j" i# RTerrainTextureGenerator(Full Source Code):http://www.insanesoftware.de/index.php?page=freetools/terrain.php0 g, F8 s) K6 ]$ `, U0 q: q
: y: D* n0 l! j+ r" omy email: skull@hardcore3d.net |
|