|
|
* 地形纹理
. \2 M4 |; l6 I! K大概分两种类型:rts型和fps型
: E. X/ K, U6 X, G2 k5 Z5 G/ m. I* Y6 R- B# E
**第一种:rts型。
6 V& O ^: V4 c) G和二维做法差不多,把地图分为很多Block,每块Block可能又由m*n个Tile组成。每块Block使用一张纹理。适合rts等俯视类型游戏,《魔兽3》、《魔域帝国》用到。
' s( _4 ?1 d, [; c# t优点:图像精细,适合表现细致的场景。1 I$ E- x- x$ n1 N, {
缺点:渲染时纹理切换频繁。没法做大面积LOD(Level of Detail),LOD被限制在Block内。由于Block边缘顶点纹理坐标问题,导致Block间没法共用顶点。9 `1 d5 l- t- d
# H( v* O( F A- g/ d
地貌间过渡处理: 如草地过渡到土地,简单的方法是让美术做好所有可能用到的不同地貌过渡的图片,程序计算拼接。复杂点的做法是程序计算纹理融合,在渲染是用多层纹理来解决过渡问题,《Empire Earth》,《C&C将军》使用类似做法。: }2 }, x- H* O) V% H: c
k& {- ~6 v5 E, y0 m5 Y
特效处理:
% R$ V* v. L2 _' [( M: s. H! C水深效果:使用顶点色形成水下体积雾效果。+ S) Y# w: B5 R k
; Q: I) [' C! ^" g5 m- u**第二种:fps型。
8 b+ d E. g; G: I. ?1 H3 c/ y整个地形用一张基本纹理(如:1024*1024)铺满,这张纹理是由程序计算生成(Terrain Texture Generation)。适合室外大场景游戏,如室外fps,飞行模拟。《Battle Field 1942》用到。
4 J; U* T1 i$ y( }优点:任意的LOD范围。无纹理切换问题。可以把计算好的地形LightMap融入基本纹理,一次渲染。
: N# N" h" p, D3 G缺点:图像精度不够,解决方法是在渲染时上面加一层细节贴图,如:BumpMap,《Ground Control》用到。. b8 L* X8 F1 u2 [1 T0 P. @ t
, L9 d# d, e) j3 ^
*下面是一些常见的问题* p& I$ K' V7 _* t$ S3 |$ c3 c
0 H& p1 m# h+ N J
**纹理生成计算方法
7 K/ I+ O% C2 c: K2 q4 T基本纹理每点像素由所处的海拔高度和坡度约束计算而得。可以理解为有一张横坐标为高度,纵坐标为坡度的纹理表,每点像素查表而来。资料见后。# H* W& f0 V2 f: k& p! D D3 v, A
2 g* Y* V ]; [1 B; a& W**地形LightMap% \4 N( j( `) I8 h. h \
明暗(Shading):首先计算每个顶点的平均法向量,注意是共点平面的平均法向量,而不是某个面的法向量,然后用你的光照模型计算公式计算该点光照强度,如:I = cos<light,normal>*Isun + ambient。顶点间光照用插值计算,如法向插值phong算法。
' {/ E" ]4 c. J6 x( f+ Q, G阴影(Shadow):没看到太好的算法,一般光线求交算法速度太慢,目前我的想法是用硬件' m/ }) }' D* _; j5 G: ]0 f( j
作ShadowVolume,渲染到一张纹理,然后保存。如果你有好的方法请告诉我。9 ?7 x. e: W1 \4 ^6 E5 Q! L
8 ?; e" o' ~1 e5 T5 P) q( R
**物体阴影
. c- U* Q- y+ j对静态物体,如房屋可事先渲染好融入Terrain LightMap。4 d" W" {) a [$ @
对动态物体,可用Projection Shadow,简单说就是从光源方向把物体影子渲染到一张纹理,然后通过使用纹理坐标生成(TexCoordGen)和修改相应Texture Coordinates Matrix,把这张图贴到地面渲染。
$ F0 t# [* K" {5 K
- b" R! L6 k/ P/ b**地形渲染
8 |& U$ J9 x9 o0 ]8 X用Indexed方式按块渲染,注意顶点提交顺序,增加GPU Vertex Cache命中率。如果有LOD,因为每次顶点数据是变化的,d3d实现时用Dynamic Vertex Buffer,把顶点放入AGP内存。2 D: |3 a f! z$ ^" p
& u# N, K. X$ a4 K**LOD(Level of Detail)
* R1 Q2 K# J* k% H8 lROAM算法不适合现代硬件加速显卡,不要用。
- B3 Q( M8 O0 Z8 v3 v: X7 |可以看一下GeomMipMap LOD和T-Strip LOD。网址见后。3 b' {! u+ K! B1 f# Z! a
# i9 S; {' s; e" S0 d( }- O
**射线与地形求交算法; D5 M( n4 S5 k3 O1 j4 ~
把射线垂直投影到2d地面网格,顺着射线方向检测经过的每个格子,如果光线在格子里面的最低处大于格子四个顶点的最高处,则不可能有交点。0 R- n% m8 {$ ~+ [
9 B, z+ C+ g- Y* K3 o资料:6 z& n3 B4 K: g l6 X, v/ L& g& Z
T-Strip LOD: http://chat.carleton.ca/~eszoka/tstriplod/tstrip.htm
7 @2 E, m4 B1 m1 p2 b8 s" [GeoMipMap LOD: http://www.flipcode.com/tutorials/geomipmaps.pdf. n4 E- B$ B& F8 `/ u8 _; _/ |
TerrainTextureGenerator(Full Source Code):http://www.insanesoftware.de/index.php?page=freetools/terrain.php5 V/ S6 Z8 |9 x$ I. T
. B. R# f% i8 Wmy email: skull@hardcore3d.net |
|