找回密码
 注册
搜索
查看: 5289|回复: 0

[收藏]3D地形相关技术

[复制链接]
发表于 2005-3-26 19:40:09 | 显示全部楼层 |阅读模式
  * 地形纹理9 y+ n+ f& e% ~$ ]
大概分两种类型:rts型和fps型
. ]$ K8 U. l6 H$ A# y0 Z- i( @7 R8 B
- p4 G3 w2 ^5 ^**第一种:rts型。
1 j4 C* |; A) G% {% F' W7 j8 N7 G和二维做法差不多,把地图分为很多Block,每块Block可能又由m*n个Tile组成。每块Block使用一张纹理。适合rts等俯视类型游戏,《魔兽3》、《魔域帝国》用到。: _9 m3 e1 C/ x7 |0 C* m7 r
优点:图像精细,适合表现细致的场景。( \7 b( m/ @" y( ~/ I/ [
缺点:渲染时纹理切换频繁。没法做大面积LOD(Level of Detail),LOD被限制在Block内。由于Block边缘顶点纹理坐标问题,导致Block间没法共用顶点。! ]& B8 G, w2 ^$ @
' r; r2 V9 ~9 T8 ]# h
地貌间过渡处理: 如草地过渡到土地,简单的方法是让美术做好所有可能用到的不同地貌过渡的图片,程序计算拼接。复杂点的做法是程序计算纹理融合,在渲染是用多层纹理来解决过渡问题,《Empire Earth》,《C&C将军》使用类似做法。
: N5 `/ i/ f' f9 k0 A' E4 p+ {3 q& d& H4 r# P& }, ]' [
特效处理:
( B' ?; X! T. w( B6 r) V' B水深效果:使用顶点色形成水下体积雾效果。7 D+ m3 E1 T) {' c' i( V

3 W7 g5 l% R5 |$ B8 {5 t**第二种:fps型。0 `/ c% j0 W6 c+ N$ Y( L  y4 T
整个地形用一张基本纹理(如:1024*1024)铺满,这张纹理是由程序计算生成(Terrain Texture Generation)。适合室外大场景游戏,如室外fps,飞行模拟。《Battle Field 1942》用到。
+ M  i, ?0 Q5 L8 [优点:任意的LOD范围。无纹理切换问题。可以把计算好的地形LightMap融入基本纹理,一次渲染。
- ^4 s5 t: t% H$ ~+ Z( [缺点:图像精度不够,解决方法是在渲染时上面加一层细节贴图,如:BumpMap,《Ground Control》用到。+ x5 l3 S( [: _
) D  m6 T2 c- t0 p3 Q
*下面是一些常见的问题/ v2 B0 ]# p8 |- }: R0 M
: m3 u+ b9 V( q! }. R, R
**纹理生成计算方法9 o+ g9 q) ]: ~( n
基本纹理每点像素由所处的海拔高度和坡度约束计算而得。可以理解为有一张横坐标为高度,纵坐标为坡度的纹理表,每点像素查表而来。资料见后。
% p) x, t  l  g: ^& M% H0 ?! @1 u2 t: x* z. Q
**地形LightMap- j: L4 t; Q& p# T5 d* C
明暗(Shading):首先计算每个顶点的平均法向量,注意是共点平面的平均法向量,而不是某个面的法向量,然后用你的光照模型计算公式计算该点光照强度,如:I = cos<light,normal>*Isun + ambient。顶点间光照用插值计算,如法向插值phong算法。& A+ [4 @+ {  o9 P. {0 I2 w% m/ n1 R
阴影(Shadow):没看到太好的算法,一般光线求交算法速度太慢,目前我的想法是用硬件
" a; L1 L& k" H; H' i作ShadowVolume,渲染到一张纹理,然后保存。如果你有好的方法请告诉我。5 M5 `& B0 S7 @1 c* s

! J* y. q; F( c1 C**物体阴影
- g. P7 M9 L0 s! L2 q对静态物体,如房屋可事先渲染好融入Terrain LightMap。3 z( D2 e5 |/ j% g! c1 O) l
对动态物体,可用Projection Shadow,简单说就是从光源方向把物体影子渲染到一张纹理,然后通过使用纹理坐标生成(TexCoordGen)和修改相应Texture Coordinates Matrix,把这张图贴到地面渲染。
' h+ p: U2 E3 A  Q5 m8 G4 }* E9 A
2 O# ^& l" y$ Z; x**地形渲染
9 H' j2 C6 }; T8 z9 L+ `用Indexed方式按块渲染,注意顶点提交顺序,增加GPU Vertex Cache命中率。如果有LOD,因为每次顶点数据是变化的,d3d实现时用Dynamic Vertex Buffer,把顶点放入AGP内存。( i9 a7 m( q3 ]) h! E

) j7 h* Y1 `. K5 v# m**LOD(Level of Detail)
$ q! h# E* I. [7 KROAM算法不适合现代硬件加速显卡,不要用。
9 U5 e' Y3 q+ q- G, y, Z6 X; h% W可以看一下GeomMipMap LOD和T-Strip LOD。网址见后。8 Z" {' h3 H0 Z, K3 s
1 {; ]- i2 I8 U" B
**射线与地形求交算法
) S( r' a- x- k' w3 s2 j把射线垂直投影到2d地面网格,顺着射线方向检测经过的每个格子,如果光线在格子里面的最低处大于格子四个顶点的最高处,则不可能有交点。- j6 H/ A* u% Z( }# \  Y  a* k$ z
8 {: H8 y3 T/ v( M* e1 P
资料:' U8 X" Z8 V( F# c3 Q
T-Strip LOD: http://chat.carleton.ca/~eszoka/tstriplod/tstrip.htm  Y3 ?& i; R) Q. E8 R9 U9 s
GeoMipMap LOD: http://www.flipcode.com/tutorials/geomipmaps.pdf
# p/ Y) k  y! A& s7 }TerrainTextureGenerator(Full Source Code):http://www.insanesoftware.de/index.php?page=freetools/terrain.php
6 }+ J( ]) t' E" ~+ y- G0 U1 `0 ~3 v" l  K
my email: skull@hardcore3d.net
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|宁德市腾云网络科技有限公司 ( 闽ICP备2022007940号-5|闽公网安备 35092202000206号 )

GMT+8, 2026-8-14 00:06 , Processed in 0.019481 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表