|
|
* 地形纹理
6 S5 Y$ Q6 W. @5 u+ E% J# v$ e大概分两种类型:rts型和fps型, X4 x. p4 U6 t3 p: q
. `% f8 Z8 J+ w**第一种:rts型。
" M4 ~" L/ B: p& _" @! ]/ I4 U和二维做法差不多,把地图分为很多Block,每块Block可能又由m*n个Tile组成。每块Block使用一张纹理。适合rts等俯视类型游戏,《魔兽3》、《魔域帝国》用到。
2 |) j+ ~+ p) J# z优点:图像精细,适合表现细致的场景。
& w: H' O/ z: [# w2 ^( y缺点:渲染时纹理切换频繁。没法做大面积LOD(Level of Detail),LOD被限制在Block内。由于Block边缘顶点纹理坐标问题,导致Block间没法共用顶点。
! t: R! y. _; O! \0 }7 }; g& G2 C. ?1 w$ O6 i; u5 Y) }
地貌间过渡处理: 如草地过渡到土地,简单的方法是让美术做好所有可能用到的不同地貌过渡的图片,程序计算拼接。复杂点的做法是程序计算纹理融合,在渲染是用多层纹理来解决过渡问题,《Empire Earth》,《C&C将军》使用类似做法。
& m0 N& Y& p: u1 x
/ `% A4 [0 w5 N7 N特效处理:
5 t9 s; N9 p& I7 a$ |水深效果:使用顶点色形成水下体积雾效果。
: z' Z7 z) y$ `# X+ w$ ^) t" p1 f
" l" x D; x5 [2 j3 Z5 j" y**第二种:fps型。5 Y- s1 [, J+ v6 f. O! @2 ^
整个地形用一张基本纹理(如:1024*1024)铺满,这张纹理是由程序计算生成(Terrain Texture Generation)。适合室外大场景游戏,如室外fps,飞行模拟。《Battle Field 1942》用到。
0 w+ M6 L* ^: p$ \优点:任意的LOD范围。无纹理切换问题。可以把计算好的地形LightMap融入基本纹理,一次渲染。
5 w( Z6 ~# X2 E6 X* A/ y( }5 ?5 x缺点:图像精度不够,解决方法是在渲染时上面加一层细节贴图,如:BumpMap,《Ground Control》用到。' s% C$ F9 n) I* N5 d7 b: R8 L
3 c9 J( `7 i" f* v
*下面是一些常见的问题
5 \1 j. g8 q/ n' o4 T
, x# o) H) u+ u% C' V) c6 ~**纹理生成计算方法
% _# ^: L, ~$ `: u7 M1 B基本纹理每点像素由所处的海拔高度和坡度约束计算而得。可以理解为有一张横坐标为高度,纵坐标为坡度的纹理表,每点像素查表而来。资料见后。
- {2 j$ U9 a# e! X' u7 {! Y( {- b& T( {: r, {7 _6 l
**地形LightMap+ C2 T. @7 m! y2 Q2 _& M
明暗(Shading):首先计算每个顶点的平均法向量,注意是共点平面的平均法向量,而不是某个面的法向量,然后用你的光照模型计算公式计算该点光照强度,如:I = cos<light,normal>*Isun + ambient。顶点间光照用插值计算,如法向插值phong算法。 i5 X9 k" J+ h& x
阴影(Shadow):没看到太好的算法,一般光线求交算法速度太慢,目前我的想法是用硬件7 I, \3 g$ A9 q+ s: X. v( G
作ShadowVolume,渲染到一张纹理,然后保存。如果你有好的方法请告诉我。
$ Z$ R" P9 ]8 F5 G- u& G
( W6 R+ d+ e( S1 _**物体阴影
) L- {; u( A8 j3 l9 B# P+ A2 b1 R对静态物体,如房屋可事先渲染好融入Terrain LightMap。
1 t" o( w- D% R' n对动态物体,可用Projection Shadow,简单说就是从光源方向把物体影子渲染到一张纹理,然后通过使用纹理坐标生成(TexCoordGen)和修改相应Texture Coordinates Matrix,把这张图贴到地面渲染。) t0 i7 ~+ c6 `- b- c' o) ?
; a p- C8 ~; Q1 g3 l0 n2 e
**地形渲染
2 G2 C0 o: B% o+ k3 W$ v3 w用Indexed方式按块渲染,注意顶点提交顺序,增加GPU Vertex Cache命中率。如果有LOD,因为每次顶点数据是变化的,d3d实现时用Dynamic Vertex Buffer,把顶点放入AGP内存。, l( Q& n% F3 L/ E- Q
1 T. J! E5 u9 }3 J" Q; d0 ^**LOD(Level of Detail)# a- _. ^. L2 x3 D* Z
ROAM算法不适合现代硬件加速显卡,不要用。8 S0 z' ~7 t3 X; s A4 g
可以看一下GeomMipMap LOD和T-Strip LOD。网址见后。
' m9 L# `- H# M- l1 C1 j) J2 L- v! k+ m& H: Z
**射线与地形求交算法0 k: J7 g# K1 m- m% O2 m
把射线垂直投影到2d地面网格,顺着射线方向检测经过的每个格子,如果光线在格子里面的最低处大于格子四个顶点的最高处,则不可能有交点。, D" g8 u- x7 G- {. D9 `
) {, O$ J0 l7 q' n$ }资料:2 Q' P! {" \$ V# B6 z" v! _
T-Strip LOD: http://chat.carleton.ca/~eszoka/tstriplod/tstrip.htm0 e. p8 T, t" ?2 K0 t: Z4 M; X
GeoMipMap LOD: http://www.flipcode.com/tutorials/geomipmaps.pdf+ n0 j' d/ A: w. i3 E: Z
TerrainTextureGenerator(Full Source Code):http://www.insanesoftware.de/index.php?page=freetools/terrain.php
G2 G% a: _* Z2 O. I* _$ x+ b( V% t) J
my email: skull@hardcore3d.net |
|