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

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

[复制链接]
发表于 2005-3-26 19:40:09 | 显示全部楼层 |阅读模式
  * 地形纹理% f9 ^; z7 p  w
大概分两种类型:rts型和fps型
$ f- _; w# g1 l$ l: F2 e  j
7 j+ {# f! l' i1 i" x**第一种:rts型。& g( {3 [, K7 G! h5 {
和二维做法差不多,把地图分为很多Block,每块Block可能又由m*n个Tile组成。每块Block使用一张纹理。适合rts等俯视类型游戏,《魔兽3》、《魔域帝国》用到。  B4 U0 O5 B: Y, a% L- T' y7 c
优点:图像精细,适合表现细致的场景。/ N: f% I  V/ e- q, F
缺点:渲染时纹理切换频繁。没法做大面积LOD(Level of Detail),LOD被限制在Block内。由于Block边缘顶点纹理坐标问题,导致Block间没法共用顶点。& h2 e% [+ u9 L! r& J8 M
0 J. J% g0 G+ C9 ]; y0 i& k
地貌间过渡处理: 如草地过渡到土地,简单的方法是让美术做好所有可能用到的不同地貌过渡的图片,程序计算拼接。复杂点的做法是程序计算纹理融合,在渲染是用多层纹理来解决过渡问题,《Empire Earth》,《C&C将军》使用类似做法。% L9 Y, v9 }& w+ N- S% o  Q' Y7 |  h
1 {9 B! B; j8 R$ _# b5 U1 @2 F
特效处理:
6 X7 E- R/ m% a6 c/ i' l水深效果:使用顶点色形成水下体积雾效果。
6 z2 a* l. R" [. w8 {7 u/ Q  X8 {, L9 m5 r1 C+ ]2 R% _
**第二种:fps型。& S- M" N+ R( f, t. f4 B
整个地形用一张基本纹理(如:1024*1024)铺满,这张纹理是由程序计算生成(Terrain Texture Generation)。适合室外大场景游戏,如室外fps,飞行模拟。《Battle Field 1942》用到。1 |& k! @8 E/ c3 G6 R( g8 B3 p- e' t
优点:任意的LOD范围。无纹理切换问题。可以把计算好的地形LightMap融入基本纹理,一次渲染。; i' {6 l# o: E
缺点:图像精度不够,解决方法是在渲染时上面加一层细节贴图,如:BumpMap,《Ground Control》用到。  Q3 P3 ~3 |+ k, Q) x/ N1 J

+ f; J$ }+ W9 r6 ]*下面是一些常见的问题* ~% W, O  l$ H6 u. o$ n8 R
" e, U2 F& V$ S# e: K0 s3 R
**纹理生成计算方法
7 I  ]* u  z4 q+ b8 l基本纹理每点像素由所处的海拔高度和坡度约束计算而得。可以理解为有一张横坐标为高度,纵坐标为坡度的纹理表,每点像素查表而来。资料见后。  G4 B/ a8 B% r) l+ [* \2 N' h4 v
! X# O  v* b4 U# P. J0 q/ U+ ?
**地形LightMap
4 K1 j+ C4 c  V+ ^+ H" M* `' d1 y明暗(Shading):首先计算每个顶点的平均法向量,注意是共点平面的平均法向量,而不是某个面的法向量,然后用你的光照模型计算公式计算该点光照强度,如:I = cos<light,normal>*Isun + ambient。顶点间光照用插值计算,如法向插值phong算法。
: T* m" \) Q  V% j% d' D阴影(Shadow):没看到太好的算法,一般光线求交算法速度太慢,目前我的想法是用硬件* ^% m' m' k, l' I
作ShadowVolume,渲染到一张纹理,然后保存。如果你有好的方法请告诉我。
% U6 @6 p, b! |+ \) R7 n. N* m
% T# y* D" p& c/ p**物体阴影
5 d4 \9 q5 R* J! Q. P. a5 C对静态物体,如房屋可事先渲染好融入Terrain LightMap。  ^2 J: T: n) j8 `4 D
对动态物体,可用Projection Shadow,简单说就是从光源方向把物体影子渲染到一张纹理,然后通过使用纹理坐标生成(TexCoordGen)和修改相应Texture Coordinates Matrix,把这张图贴到地面渲染。" d5 v! u, E- ]' g
+ _; d( G4 g! A% ^+ a# u, l& q
**地形渲染8 z$ c0 E% ?7 q8 N' l3 B8 E
用Indexed方式按块渲染,注意顶点提交顺序,增加GPU Vertex Cache命中率。如果有LOD,因为每次顶点数据是变化的,d3d实现时用Dynamic Vertex Buffer,把顶点放入AGP内存。
0 M- K. K! h$ ?1 c. k- c9 P5 l+ \3 X; N' \; u5 S: ]
**LOD(Level of Detail)
/ J2 t  U, x# pROAM算法不适合现代硬件加速显卡,不要用。" V* O8 `8 p2 {4 r$ o
可以看一下GeomMipMap LOD和T-Strip LOD。网址见后。
: ^$ M" c4 D! a5 y6 m& {/ U5 M
0 r0 B1 I3 k; x5 y4 G**射线与地形求交算法
% O: Q  G* U( o/ P把射线垂直投影到2d地面网格,顺着射线方向检测经过的每个格子,如果光线在格子里面的最低处大于格子四个顶点的最高处,则不可能有交点。# ~% j# U1 s" a0 E: j
3 |4 S$ |- p$ @9 ]7 Q5 m
资料:4 s* U* L# Q7 r/ m
T-Strip LOD: http://chat.carleton.ca/~eszoka/tstriplod/tstrip.htm& g( q# P" }  z( w) m. w* P: X
GeoMipMap LOD: http://www.flipcode.com/tutorials/geomipmaps.pdf
" t: c$ \0 t* yTerrainTextureGenerator(Full Source Code):http://www.insanesoftware.de/index.php?page=freetools/terrain.php" I5 O1 ]! ^2 w( d, T) g

, d* J# _# O  h! O/ `8 {9 Lmy email: skull@hardcore3d.net
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-8-13 22:51 , Processed in 0.018236 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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