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

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

[复制链接]
发表于 2005-3-26 19:40:09 | 显示全部楼层 |阅读模式
  * 地形纹理
, K6 V" j9 [. l$ b大概分两种类型:rts型和fps型, s) S% N9 F8 |3 ^
; R  J9 k& I- X) l# z
**第一种:rts型。
1 J. ^! W' O" Y, s5 G+ u- Y1 e; V和二维做法差不多,把地图分为很多Block,每块Block可能又由m*n个Tile组成。每块Block使用一张纹理。适合rts等俯视类型游戏,《魔兽3》、《魔域帝国》用到。
1 A" c$ u; {6 r' w优点:图像精细,适合表现细致的场景。
" Q( M8 h9 k5 P+ \缺点:渲染时纹理切换频繁。没法做大面积LOD(Level of Detail),LOD被限制在Block内。由于Block边缘顶点纹理坐标问题,导致Block间没法共用顶点。
9 Q# h, {! C( u+ A/ @. S) {
+ j* G# a4 M- K- q地貌间过渡处理: 如草地过渡到土地,简单的方法是让美术做好所有可能用到的不同地貌过渡的图片,程序计算拼接。复杂点的做法是程序计算纹理融合,在渲染是用多层纹理来解决过渡问题,《Empire Earth》,《C&C将军》使用类似做法。  U  L2 |: d) d6 r
$ }( V. D8 P! M. W0 ]
特效处理:
' N1 n; h+ L) H水深效果:使用顶点色形成水下体积雾效果。7 J$ M; J. x9 V1 d* C0 ~" X

. _( h% E# N/ D( o6 Z4 \5 K& B**第二种:fps型。$ e# w9 r  M* k
整个地形用一张基本纹理(如:1024*1024)铺满,这张纹理是由程序计算生成(Terrain Texture Generation)。适合室外大场景游戏,如室外fps,飞行模拟。《Battle Field 1942》用到。
1 F+ r! n" j4 s7 E" p优点:任意的LOD范围。无纹理切换问题。可以把计算好的地形LightMap融入基本纹理,一次渲染。
* T; w1 Q; z5 u' h2 S缺点:图像精度不够,解决方法是在渲染时上面加一层细节贴图,如:BumpMap,《Ground Control》用到。
* f/ Z! ?) F$ v" y# ^) T
/ D# |9 Y4 [& @+ o# b+ Y8 T% ^  j3 b' b*下面是一些常见的问题
( I- ^* l- \( w
" Q: A+ J4 L4 y$ u! Q**纹理生成计算方法
" ^/ T  G1 i! e; }! V  e* ]基本纹理每点像素由所处的海拔高度和坡度约束计算而得。可以理解为有一张横坐标为高度,纵坐标为坡度的纹理表,每点像素查表而来。资料见后。% J5 L8 ?# c9 S0 _$ C

! q9 h5 _# }  C# _. M- q5 ~9 J! S**地形LightMap' ~0 E# y6 X0 o9 N% \4 C9 G
明暗(Shading):首先计算每个顶点的平均法向量,注意是共点平面的平均法向量,而不是某个面的法向量,然后用你的光照模型计算公式计算该点光照强度,如:I = cos<light,normal>*Isun + ambient。顶点间光照用插值计算,如法向插值phong算法。0 e  T0 c  g" v, O5 `" H! K
阴影(Shadow):没看到太好的算法,一般光线求交算法速度太慢,目前我的想法是用硬件
8 {5 ^. u* L3 b" @$ F2 U3 H, W作ShadowVolume,渲染到一张纹理,然后保存。如果你有好的方法请告诉我。+ M2 Y6 u& q4 a

0 x' ?. L. H5 b7 ^, a**物体阴影
, Z" s! |8 n9 N/ f2 _对静态物体,如房屋可事先渲染好融入Terrain LightMap。' X% G9 `: H! {6 L% j
对动态物体,可用Projection Shadow,简单说就是从光源方向把物体影子渲染到一张纹理,然后通过使用纹理坐标生成(TexCoordGen)和修改相应Texture Coordinates Matrix,把这张图贴到地面渲染。& Z- o, C$ U, [( q4 ^8 Z

8 h4 Q7 M4 {  N1 B) T  {**地形渲染
7 X; J$ `: E2 k% Q3 K( c用Indexed方式按块渲染,注意顶点提交顺序,增加GPU Vertex Cache命中率。如果有LOD,因为每次顶点数据是变化的,d3d实现时用Dynamic Vertex Buffer,把顶点放入AGP内存。/ w! w+ v$ I. c8 x. s2 P* N8 Z9 F
$ z2 |5 F5 D* E
**LOD(Level of Detail)- D. B6 w0 Z# e- r
ROAM算法不适合现代硬件加速显卡,不要用。
" u1 J' v5 S7 U可以看一下GeomMipMap LOD和T-Strip LOD。网址见后。8 \1 y) Z6 F, y" \6 N, r% N  l( K

; C1 J4 y4 V: G) d3 ?2 q**射线与地形求交算法* n7 A1 a: m! ~0 d8 L+ {
把射线垂直投影到2d地面网格,顺着射线方向检测经过的每个格子,如果光线在格子里面的最低处大于格子四个顶点的最高处,则不可能有交点。% |. `# m9 x' B9 \* j& H4 H
4 d1 B8 k! C. J5 C
资料:* s) J) \  u3 u5 y5 @" G3 m5 N
T-Strip LOD: http://chat.carleton.ca/~eszoka/tstriplod/tstrip.htm* E( l7 V' H& m8 e+ e
GeoMipMap LOD: http://www.flipcode.com/tutorials/geomipmaps.pdf& v- D9 f1 O. g' u
TerrainTextureGenerator(Full Source Code):http://www.insanesoftware.de/index.php?page=freetools/terrain.php7 Q. J! [0 h- H) {% B& Y
  b! V7 n$ p7 M: m5 y2 ?* o2 t
my email: skull@hardcore3d.net
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-6-19 09:23 , Processed in 0.014364 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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