|
* 地形纹理
8 p; Q. k% q8 F0 d1 h大概分两种类型:rts型和fps型. z# w1 W0 x8 D( {/ @$ `
( O6 @. O4 R, ^* W, ?/ E3 h
**第一种:rts型。9 B. M3 E y: ?& b2 q, o, J. R6 f
和二维做法差不多,把地图分为很多Block,每块Block可能又由m*n个Tile组成。每块Block使用一张纹理。适合rts等俯视类型游戏,《魔兽3》、《魔域帝国》用到。
/ @' Y s& ], X优点:图像精细,适合表现细致的场景。
' ^8 H6 O9 a( r; H0 R/ o' P; s缺点:渲染时纹理切换频繁。没法做大面积LOD(Level of Detail),LOD被限制在Block内。由于Block边缘顶点纹理坐标问题,导致Block间没法共用顶点。
3 f( m/ n3 K" A+ o6 f6 e8 z7 J9 z
地貌间过渡处理: 如草地过渡到土地,简单的方法是让美术做好所有可能用到的不同地貌过渡的图片,程序计算拼接。复杂点的做法是程序计算纹理融合,在渲染是用多层纹理来解决过渡问题,《Empire Earth》,《C&C将军》使用类似做法。& W; M) M/ v* Y, o# r6 s" e1 C
; O! B3 Z F1 @特效处理:" j1 P; X7 i0 q$ d
水深效果:使用顶点色形成水下体积雾效果。( K# t: w4 \# f! j( y0 a# M b
% Y- o" q( r+ E; @) ^4 S# p
**第二种:fps型。. M+ m3 h& |6 b7 i
整个地形用一张基本纹理(如:1024*1024)铺满,这张纹理是由程序计算生成(Terrain Texture Generation)。适合室外大场景游戏,如室外fps,飞行模拟。《Battle Field 1942》用到。. W% P+ o5 r" S+ i5 h# [4 ?7 g, w1 L0 `
优点:任意的LOD范围。无纹理切换问题。可以把计算好的地形LightMap融入基本纹理,一次渲染。- t8 y0 L; Z: p/ A! u
缺点:图像精度不够,解决方法是在渲染时上面加一层细节贴图,如:BumpMap,《Ground Control》用到。
* ?7 ^* A6 Q+ o3 q" @2 t! V3 K# } a5 f5 n0 Q1 h. [- y" \
*下面是一些常见的问题
# F3 n- y5 z- w
& m8 r1 {0 s0 O% ~: i/ |**纹理生成计算方法$ l$ [6 H9 S! x
基本纹理每点像素由所处的海拔高度和坡度约束计算而得。可以理解为有一张横坐标为高度,纵坐标为坡度的纹理表,每点像素查表而来。资料见后。
( f7 @* T( l H2 K6 A2 j z# O6 K5 t) Q8 G% ~- S1 z* l F c5 v
**地形LightMap# t1 d) }5 o! |6 y+ n+ \. ~
明暗(Shading):首先计算每个顶点的平均法向量,注意是共点平面的平均法向量,而不是某个面的法向量,然后用你的光照模型计算公式计算该点光照强度,如:I = cos<light,normal>*Isun + ambient。顶点间光照用插值计算,如法向插值phong算法。
g* K2 w8 d1 m6 A3 T3 ?9 w阴影(Shadow):没看到太好的算法,一般光线求交算法速度太慢,目前我的想法是用硬件7 g1 F0 e1 `4 y4 H
作ShadowVolume,渲染到一张纹理,然后保存。如果你有好的方法请告诉我。, ]* n; O5 N! x: H' H& ~2 {
! i% k+ g9 G% P" \2 X**物体阴影 ]. Z/ E: W6 X! Z, m: t# _+ u
对静态物体,如房屋可事先渲染好融入Terrain LightMap。& p, T6 H& y( Z5 X
对动态物体,可用Projection Shadow,简单说就是从光源方向把物体影子渲染到一张纹理,然后通过使用纹理坐标生成(TexCoordGen)和修改相应Texture Coordinates Matrix,把这张图贴到地面渲染。# c0 N4 o! `1 n+ j* |" E; s$ ?+ @
% ~! ?5 {; x& G**地形渲染% A* W3 t% ^ n8 r
用Indexed方式按块渲染,注意顶点提交顺序,增加GPU Vertex Cache命中率。如果有LOD,因为每次顶点数据是变化的,d3d实现时用Dynamic Vertex Buffer,把顶点放入AGP内存。 Y p; H4 O% I
$ y& X* v9 u! @3 d5 S7 y/ ~
**LOD(Level of Detail)
u! e2 [' }! q6 GROAM算法不适合现代硬件加速显卡,不要用。
4 s5 E% ?$ M5 u& i! W! z- H可以看一下GeomMipMap LOD和T-Strip LOD。网址见后。
( `& e% w. a6 L; D' v: @5 ]2 w* Y. m* U' S; a$ ~& v# E
**射线与地形求交算法6 D0 N4 [4 U9 ^. T4 C" z
把射线垂直投影到2d地面网格,顺着射线方向检测经过的每个格子,如果光线在格子里面的最低处大于格子四个顶点的最高处,则不可能有交点。: E7 d/ a ]) P4 I' [
' g) a! I1 _- {' I: h
资料:$ S3 o- f4 a- ~( X& ^
T-Strip LOD: http://chat.carleton.ca/~eszoka/tstriplod/tstrip.htm- j4 p& J& a% M* o) e
GeoMipMap LOD: http://www.flipcode.com/tutorials/geomipmaps.pdf# n% |( i! r' t! P
TerrainTextureGenerator(Full Source Code):http://www.insanesoftware.de/index.php?page=freetools/terrain.php
( A7 |' ]2 u2 F, n( D9 ]
, U# x% [! [; y! Cmy email: skull@hardcore3d.net |
|