|
|
* 地形纹理3 Z8 r5 k. o }! a
大概分两种类型:rts型和fps型, O9 j6 ^5 K U9 `$ u& |( V2 q
8 G$ i2 T- V2 F9 z# x
**第一种:rts型。8 r6 Q6 Z! F& I) ~/ y! r; ]& d
和二维做法差不多,把地图分为很多Block,每块Block可能又由m*n个Tile组成。每块Block使用一张纹理。适合rts等俯视类型游戏,《魔兽3》、《魔域帝国》用到。- D6 T) r, d. v. K! G+ H$ {
优点:图像精细,适合表现细致的场景。% l. z0 l( S6 ]
缺点:渲染时纹理切换频繁。没法做大面积LOD(Level of Detail),LOD被限制在Block内。由于Block边缘顶点纹理坐标问题,导致Block间没法共用顶点。0 H, y& x# f. Y' k
" P3 G4 M# \' P+ a
地貌间过渡处理: 如草地过渡到土地,简单的方法是让美术做好所有可能用到的不同地貌过渡的图片,程序计算拼接。复杂点的做法是程序计算纹理融合,在渲染是用多层纹理来解决过渡问题,《Empire Earth》,《C&C将军》使用类似做法。" l! D+ N9 k6 u/ o- [# K$ l9 [
, S2 T% @9 O4 W" k' B特效处理:
( G& |7 |% J8 r( w7 h水深效果:使用顶点色形成水下体积雾效果。
6 q% g6 G! T% D" g \( b3 i z1 ~7 v' w& t8 R% z
**第二种:fps型。
) S; u6 T% X1 i0 i- o* p! D" e6 [整个地形用一张基本纹理(如:1024*1024)铺满,这张纹理是由程序计算生成(Terrain Texture Generation)。适合室外大场景游戏,如室外fps,飞行模拟。《Battle Field 1942》用到。
; p* d' l( S, C. ~% U$ s优点:任意的LOD范围。无纹理切换问题。可以把计算好的地形LightMap融入基本纹理,一次渲染。
# F; C( ` B. D P缺点:图像精度不够,解决方法是在渲染时上面加一层细节贴图,如:BumpMap,《Ground Control》用到。
* Y7 u. Q" Y m5 U @4 B( Q1 H1 `9 a) ?0 w# ]
*下面是一些常见的问题" @: H. h3 M2 \1 n
7 b' x% A6 U7 L$ t* S l: @**纹理生成计算方法
' z( P( N# X% E# x0 N基本纹理每点像素由所处的海拔高度和坡度约束计算而得。可以理解为有一张横坐标为高度,纵坐标为坡度的纹理表,每点像素查表而来。资料见后。3 E# J! D$ Y3 U2 q) {9 p
& F, N9 q/ X0 t$ z9 {! k* x9 e**地形LightMap* d$ l v6 _7 B5 w+ y8 b
明暗(Shading):首先计算每个顶点的平均法向量,注意是共点平面的平均法向量,而不是某个面的法向量,然后用你的光照模型计算公式计算该点光照强度,如:I = cos<light,normal>*Isun + ambient。顶点间光照用插值计算,如法向插值phong算法。
) C0 f x) `5 j; w# i) G阴影(Shadow):没看到太好的算法,一般光线求交算法速度太慢,目前我的想法是用硬件
8 I" N) U }% O' Y) t作ShadowVolume,渲染到一张纹理,然后保存。如果你有好的方法请告诉我。
% E+ i; {; p+ p. [) \* A& T. W0 d2 P/ T: G8 J6 `% l: c7 E; w
**物体阴影
; @0 c3 P q3 l. r1 _ V对静态物体,如房屋可事先渲染好融入Terrain LightMap。8 _7 J! t, ^" t; M
对动态物体,可用Projection Shadow,简单说就是从光源方向把物体影子渲染到一张纹理,然后通过使用纹理坐标生成(TexCoordGen)和修改相应Texture Coordinates Matrix,把这张图贴到地面渲染。
5 J1 e/ M7 W& j; N4 q+ b9 Y" w5 J7 @) u9 S) x
**地形渲染
9 q3 k" A- D1 h' b; E用Indexed方式按块渲染,注意顶点提交顺序,增加GPU Vertex Cache命中率。如果有LOD,因为每次顶点数据是变化的,d3d实现时用Dynamic Vertex Buffer,把顶点放入AGP内存。" q& I+ @8 O5 o7 ^! J7 r8 z7 W& o
& G$ @: o) K* w" W**LOD(Level of Detail)
7 t) F" \- X5 l0 ~; o2 SROAM算法不适合现代硬件加速显卡,不要用。+ A( x3 ?* H% k U
可以看一下GeomMipMap LOD和T-Strip LOD。网址见后。( Y5 D2 t1 \: j/ N# Y# @/ ~" A
b% @. |7 k- [**射线与地形求交算法
; J, Z: `! q- N/ B0 ?把射线垂直投影到2d地面网格,顺着射线方向检测经过的每个格子,如果光线在格子里面的最低处大于格子四个顶点的最高处,则不可能有交点。0 M) U+ O f4 d( [- i
9 p D* W0 `3 e3 L ]6 L" e7 Y4 R' h$ g
资料:
5 X( @: R8 p7 m- y9 `5 @T-Strip LOD: http://chat.carleton.ca/~eszoka/tstriplod/tstrip.htm4 R- v& F0 }( g9 X+ \
GeoMipMap LOD: http://www.flipcode.com/tutorials/geomipmaps.pdf
; E) i( v2 ?% e5 fTerrainTextureGenerator(Full Source Code):http://www.insanesoftware.de/index.php?page=freetools/terrain.php5 x" y# o! J3 N$ @
6 `' \( M$ M2 U0 x& W" V
my email: skull@hardcore3d.net |
|