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

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

[复制链接]
发表于 2005-3-26 19:40:09 | 显示全部楼层 |阅读模式
  * 地形纹理
3 h7 H8 _# T* [大概分两种类型:rts型和fps型
. z. }1 d5 Q- J. h' h9 u: x( T: }' u/ R
**第一种:rts型。
, z5 b# p" E2 b, {  x和二维做法差不多,把地图分为很多Block,每块Block可能又由m*n个Tile组成。每块Block使用一张纹理。适合rts等俯视类型游戏,《魔兽3》、《魔域帝国》用到。2 L" k, f: ?2 j& y1 v, q1 n3 O
优点:图像精细,适合表现细致的场景。; U: b* M# y2 p- b
缺点:渲染时纹理切换频繁。没法做大面积LOD(Level of Detail),LOD被限制在Block内。由于Block边缘顶点纹理坐标问题,导致Block间没法共用顶点。$ ^& U' G7 t) S$ K8 d, f

3 \! d# n7 V1 O) u7 b7 F地貌间过渡处理: 如草地过渡到土地,简单的方法是让美术做好所有可能用到的不同地貌过渡的图片,程序计算拼接。复杂点的做法是程序计算纹理融合,在渲染是用多层纹理来解决过渡问题,《Empire Earth》,《C&C将军》使用类似做法。
& F9 g) L9 Z- \) ]8 B; I' I
" C" m0 Y  P3 ^9 z& M: E% {特效处理:% C  Q$ W" g; G& q( S9 [6 z
水深效果:使用顶点色形成水下体积雾效果。' ~, L9 _0 V9 I* ]( ]  P$ e3 k

$ u/ P* n) y( m**第二种:fps型。
' Y; D5 q- O3 U4 T整个地形用一张基本纹理(如:1024*1024)铺满,这张纹理是由程序计算生成(Terrain Texture Generation)。适合室外大场景游戏,如室外fps,飞行模拟。《Battle Field 1942》用到。
) E6 a" I4 X  s- J  b1 x) b4 |8 P优点:任意的LOD范围。无纹理切换问题。可以把计算好的地形LightMap融入基本纹理,一次渲染。9 {; @9 N% d7 T  Q( O- [
缺点:图像精度不够,解决方法是在渲染时上面加一层细节贴图,如:BumpMap,《Ground Control》用到。
& V" \& D' C3 b; z. ]  k- P9 @: [- N& s( @& Y
*下面是一些常见的问题7 N5 E+ n1 [# {! I

5 e. |/ a8 s* s* \**纹理生成计算方法
+ Q5 N4 t. ^* R2 @1 R' F# K/ U基本纹理每点像素由所处的海拔高度和坡度约束计算而得。可以理解为有一张横坐标为高度,纵坐标为坡度的纹理表,每点像素查表而来。资料见后。6 z; X8 I  K% Y% ~' c9 |5 N
; Q+ d* R3 K4 m! k; V+ B
**地形LightMap
+ a& V! @& R. ?, w明暗(Shading):首先计算每个顶点的平均法向量,注意是共点平面的平均法向量,而不是某个面的法向量,然后用你的光照模型计算公式计算该点光照强度,如:I = cos<light,normal>*Isun + ambient。顶点间光照用插值计算,如法向插值phong算法。
& W& [5 S" W/ r* ^( K, \阴影(Shadow):没看到太好的算法,一般光线求交算法速度太慢,目前我的想法是用硬件
0 T8 x/ w/ c/ [6 m% R  B; {# Y作ShadowVolume,渲染到一张纹理,然后保存。如果你有好的方法请告诉我。, H9 W" Q  M0 F: C

6 E: Z( \# p7 ?) `+ S3 N**物体阴影) e7 M2 a5 F! m
对静态物体,如房屋可事先渲染好融入Terrain LightMap。! Y3 y7 O# i0 }. ~! ~8 `
对动态物体,可用Projection Shadow,简单说就是从光源方向把物体影子渲染到一张纹理,然后通过使用纹理坐标生成(TexCoordGen)和修改相应Texture Coordinates Matrix,把这张图贴到地面渲染。
& b: {4 L7 x5 R% b' ?( x+ @( w! t$ ~+ J8 s, y
**地形渲染
. A( [; H- G8 w5 A用Indexed方式按块渲染,注意顶点提交顺序,增加GPU Vertex Cache命中率。如果有LOD,因为每次顶点数据是变化的,d3d实现时用Dynamic Vertex Buffer,把顶点放入AGP内存。% `3 i. r2 I0 i+ A) f
- L  R) t& d) I8 c6 c, g" _/ m
**LOD(Level of Detail)6 B& N+ ?+ ^, [- Z. h. q
ROAM算法不适合现代硬件加速显卡,不要用。# O+ D- L$ q. A: R! O  m
可以看一下GeomMipMap LOD和T-Strip LOD。网址见后。$ g% f: m5 T, R: i0 t- i. Z

% f5 }$ e$ y8 Q**射线与地形求交算法
# u: n7 ?# V1 @1 {. N3 M$ ]把射线垂直投影到2d地面网格,顺着射线方向检测经过的每个格子,如果光线在格子里面的最低处大于格子四个顶点的最高处,则不可能有交点。
. p& m. C4 ~8 l% y6 n
9 _# \+ o: P6 w; G资料:8 W' a2 R9 }0 N, O& X
T-Strip LOD: http://chat.carleton.ca/~eszoka/tstriplod/tstrip.htm
! ]7 j' U* J. i" I/ HGeoMipMap LOD: http://www.flipcode.com/tutorials/geomipmaps.pdf
* {& B. C3 [  _' E/ k/ P+ zTerrainTextureGenerator(Full Source Code):http://www.insanesoftware.de/index.php?page=freetools/terrain.php; f6 I: O  V6 t$ |& M; S) u

3 Z  b& @* k% o' Zmy email: skull@hardcore3d.net
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-8-14 01:10 , Processed in 0.018351 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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