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

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

[复制链接]
发表于 2005-3-26 19:40:09 | 显示全部楼层 |阅读模式
  * 地形纹理
0 B! G; C# h! i% m* m$ l  C大概分两种类型:rts型和fps型
; E  O# p6 T) Q$ P, J# @
4 ]7 y5 G" P" T$ I! W* P& _**第一种:rts型。
4 b( b& D* f' \8 b, x7 Q和二维做法差不多,把地图分为很多Block,每块Block可能又由m*n个Tile组成。每块Block使用一张纹理。适合rts等俯视类型游戏,《魔兽3》、《魔域帝国》用到。" [. Q4 i! I; S" Q! u9 b4 P
优点:图像精细,适合表现细致的场景。
6 u5 s! T" ]  k) L缺点:渲染时纹理切换频繁。没法做大面积LOD(Level of Detail),LOD被限制在Block内。由于Block边缘顶点纹理坐标问题,导致Block间没法共用顶点。
7 q- G1 F, u) A
8 Q# f/ T5 z$ g3 c9 F" j8 g1 |地貌间过渡处理: 如草地过渡到土地,简单的方法是让美术做好所有可能用到的不同地貌过渡的图片,程序计算拼接。复杂点的做法是程序计算纹理融合,在渲染是用多层纹理来解决过渡问题,《Empire Earth》,《C&C将军》使用类似做法。
9 a, c6 \" W* o- l4 x' J( X
2 X$ \7 E( \( r& |  U7 B* M特效处理:
) v0 U, b$ }; r2 g水深效果:使用顶点色形成水下体积雾效果。
4 q/ j( ]; d3 A3 m: N
  [, F4 D9 J8 s9 U**第二种:fps型。) j: F$ y: u. u; ?+ f/ s
整个地形用一张基本纹理(如:1024*1024)铺满,这张纹理是由程序计算生成(Terrain Texture Generation)。适合室外大场景游戏,如室外fps,飞行模拟。《Battle Field 1942》用到。
& J- r  J0 h2 R1 H+ o. b4 f9 `8 Z优点:任意的LOD范围。无纹理切换问题。可以把计算好的地形LightMap融入基本纹理,一次渲染。
/ v4 Y' F% T1 J! k% M( \缺点:图像精度不够,解决方法是在渲染时上面加一层细节贴图,如:BumpMap,《Ground Control》用到。
7 J2 {9 B1 H/ e: s, M1 s- W
: z3 i& X% U- z% b*下面是一些常见的问题
2 a, f* w% W! t4 ]3 V& n5 c# e" D5 X: ^7 ]# X! D
**纹理生成计算方法
! m' p+ g- J. A基本纹理每点像素由所处的海拔高度和坡度约束计算而得。可以理解为有一张横坐标为高度,纵坐标为坡度的纹理表,每点像素查表而来。资料见后。
; I7 Z, N; j% x$ `. b5 l+ i: o# ~; ?! `& B
**地形LightMap9 U" H& |) ~& |5 u0 G
明暗(Shading):首先计算每个顶点的平均法向量,注意是共点平面的平均法向量,而不是某个面的法向量,然后用你的光照模型计算公式计算该点光照强度,如:I = cos<light,normal>*Isun + ambient。顶点间光照用插值计算,如法向插值phong算法。
2 ]9 K' \5 X7 K- W阴影(Shadow):没看到太好的算法,一般光线求交算法速度太慢,目前我的想法是用硬件
1 p! l. G) b, U2 a作ShadowVolume,渲染到一张纹理,然后保存。如果你有好的方法请告诉我。  f, @  b3 [% u: b( I) Z+ V* X: q
3 d7 f# }1 [) Q
**物体阴影
, F- b* c4 D8 T# `对静态物体,如房屋可事先渲染好融入Terrain LightMap。
7 x7 m$ J4 i8 v9 t. K9 B- o. @  ~对动态物体,可用Projection Shadow,简单说就是从光源方向把物体影子渲染到一张纹理,然后通过使用纹理坐标生成(TexCoordGen)和修改相应Texture Coordinates Matrix,把这张图贴到地面渲染。
' d" b) M; {& U5 Z+ J5 k
+ L; B3 M, k) {7 D; N**地形渲染6 q6 e* g+ q. o4 ]! e7 S2 \- l
用Indexed方式按块渲染,注意顶点提交顺序,增加GPU Vertex Cache命中率。如果有LOD,因为每次顶点数据是变化的,d3d实现时用Dynamic Vertex Buffer,把顶点放入AGP内存。! x0 p2 g+ X( V3 j' `

6 j2 d& Z$ _! u8 j9 V" D**LOD(Level of Detail)
6 @4 O/ Q) m/ u4 U  t; b" n2 ^) q" kROAM算法不适合现代硬件加速显卡,不要用。
% L$ l/ U5 N; b. k/ ~可以看一下GeomMipMap LOD和T-Strip LOD。网址见后。
, W! }  @; c9 j9 g. V, s9 l4 ~+ u' s$ ]  X/ }! }
**射线与地形求交算法
) m8 z7 l/ S9 d4 q& C把射线垂直投影到2d地面网格,顺着射线方向检测经过的每个格子,如果光线在格子里面的最低处大于格子四个顶点的最高处,则不可能有交点。
! Q1 x# H1 w- a$ e0 P0 O; A1 |" @! O+ q: c- n3 w7 D
资料:  s4 v/ J% b0 @3 k0 A# e7 `4 J
T-Strip LOD: http://chat.carleton.ca/~eszoka/tstriplod/tstrip.htm
* \9 w. k8 _% N* |3 YGeoMipMap LOD: http://www.flipcode.com/tutorials/geomipmaps.pdf
  ^" l9 I9 R$ I& d5 L/ wTerrainTextureGenerator(Full Source Code):http://www.insanesoftware.de/index.php?page=freetools/terrain.php- V1 `, ?6 }, g; _6 `$ F7 r' ^, O
& P1 r( R, b: ^9 @: n
my email: skull@hardcore3d.net
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-8-9 07:11 , Processed in 0.033738 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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