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

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

[复制链接]
发表于 2005-3-26 19:40:09 | 显示全部楼层 |阅读模式
  * 地形纹理
) s, U5 v" f3 B/ M: v# ?+ P2 W大概分两种类型:rts型和fps型- b" N) j! H: }. S3 q  B
5 W+ e6 B$ D4 o' s, T! j8 N
**第一种:rts型。
  ]+ _2 `; Z6 O/ m' r0 X3 n和二维做法差不多,把地图分为很多Block,每块Block可能又由m*n个Tile组成。每块Block使用一张纹理。适合rts等俯视类型游戏,《魔兽3》、《魔域帝国》用到。4 J$ A5 t( J" i+ w
优点:图像精细,适合表现细致的场景。1 c. Y$ W6 K! \  B/ L, r4 Z* t& U
缺点:渲染时纹理切换频繁。没法做大面积LOD(Level of Detail),LOD被限制在Block内。由于Block边缘顶点纹理坐标问题,导致Block间没法共用顶点。
; R1 G1 l+ s' L* q5 z/ G0 U2 s% M1 y/ ~3 }7 y
地貌间过渡处理: 如草地过渡到土地,简单的方法是让美术做好所有可能用到的不同地貌过渡的图片,程序计算拼接。复杂点的做法是程序计算纹理融合,在渲染是用多层纹理来解决过渡问题,《Empire Earth》,《C&C将军》使用类似做法。* [1 Y( o& V, ?! l+ o. z; {- Q/ ?$ p
8 R3 g0 v( t+ g9 k0 g& I
特效处理:1 f2 r  H7 S9 K( i6 M( ]( t4 ?" p0 z
水深效果:使用顶点色形成水下体积雾效果。" t) N: q  ^0 v9 U9 `1 B
0 D- E1 V# p. E; f; A% h
**第二种:fps型。7 G+ |3 [% h1 E# f
整个地形用一张基本纹理(如:1024*1024)铺满,这张纹理是由程序计算生成(Terrain Texture Generation)。适合室外大场景游戏,如室外fps,飞行模拟。《Battle Field 1942》用到。1 m& O/ g+ a. f& W' p# g
优点:任意的LOD范围。无纹理切换问题。可以把计算好的地形LightMap融入基本纹理,一次渲染。" ], Y4 t* h; r, h9 ^& P
缺点:图像精度不够,解决方法是在渲染时上面加一层细节贴图,如:BumpMap,《Ground Control》用到。
! w% Y5 j+ M, \3 o* E6 \8 j& o
. U& _* |$ {7 s*下面是一些常见的问题
* e! K, Y% z" h3 p; g/ C  m
5 _7 W3 Q, H& R( G. A1 F**纹理生成计算方法0 w5 D0 s! o2 I3 a8 X- G  W
基本纹理每点像素由所处的海拔高度和坡度约束计算而得。可以理解为有一张横坐标为高度,纵坐标为坡度的纹理表,每点像素查表而来。资料见后。
/ G5 O- ?/ ~, \8 k% x, {
+ z3 z) f7 L. O  i5 j**地形LightMap
- R2 N7 W% S% p0 f  l+ \明暗(Shading):首先计算每个顶点的平均法向量,注意是共点平面的平均法向量,而不是某个面的法向量,然后用你的光照模型计算公式计算该点光照强度,如:I = cos<light,normal>*Isun + ambient。顶点间光照用插值计算,如法向插值phong算法。" w7 }4 H5 A0 O* b8 J3 Z3 u0 W9 I
阴影(Shadow):没看到太好的算法,一般光线求交算法速度太慢,目前我的想法是用硬件4 z/ |$ M# L! M5 L9 U6 |
作ShadowVolume,渲染到一张纹理,然后保存。如果你有好的方法请告诉我。
* a9 q. Z$ x# ?1 u. B1 u/ `& }2 W. x9 M! H# X6 t9 q5 p7 O: P3 B9 C9 Y5 N
**物体阴影2 B: c* p! t$ h* Y& V: b  L
对静态物体,如房屋可事先渲染好融入Terrain LightMap。( m; @" \/ S0 G% T! x
对动态物体,可用Projection Shadow,简单说就是从光源方向把物体影子渲染到一张纹理,然后通过使用纹理坐标生成(TexCoordGen)和修改相应Texture Coordinates Matrix,把这张图贴到地面渲染。' U6 v# C# B! p

, K5 L6 _+ X5 b. v5 X3 I2 V# a**地形渲染
5 S. X% T1 W: U  d用Indexed方式按块渲染,注意顶点提交顺序,增加GPU Vertex Cache命中率。如果有LOD,因为每次顶点数据是变化的,d3d实现时用Dynamic Vertex Buffer,把顶点放入AGP内存。! {! M1 F6 n5 I, Q

: ~& P" D( L9 S**LOD(Level of Detail)) J; }; S2 {0 k% y; P$ z3 Y7 ]' n
ROAM算法不适合现代硬件加速显卡,不要用。$ A6 X4 H' ]% K
可以看一下GeomMipMap LOD和T-Strip LOD。网址见后。
1 H+ L( N* {9 z* i
4 M3 C# Y# U1 a+ D( i**射线与地形求交算法
: ?% q$ d& u7 P: d把射线垂直投影到2d地面网格,顺着射线方向检测经过的每个格子,如果光线在格子里面的最低处大于格子四个顶点的最高处,则不可能有交点。  f  x0 k( `( U! ~% V' k& {
- P" _* j; }8 R% i
资料:0 r( i: V% ~  H8 V
T-Strip LOD: http://chat.carleton.ca/~eszoka/tstriplod/tstrip.htm
* K1 Z2 L2 N) ?' [GeoMipMap LOD: http://www.flipcode.com/tutorials/geomipmaps.pdf
( c$ V& U' U' I, D9 D1 rTerrainTextureGenerator(Full Source Code):http://www.insanesoftware.de/index.php?page=freetools/terrain.php
' s* B( y1 g0 D3 ]
0 a0 X9 s1 B/ W* b! wmy email: skull@hardcore3d.net
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-6-19 17:37 , Processed in 0.037101 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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