找回密码
 注册
查看: 5343|回复: 0

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

[复制链接]
发表于 2005-3-26 19:40:09 | 显示全部楼层 |阅读模式
  * 地形纹理9 w6 }& ]  X% L1 `+ G+ z( g
大概分两种类型:rts型和fps型
$ D9 Z# r3 r2 }* @* F6 N# n+ a# X6 {2 g0 X6 K  Z3 f5 \1 p
**第一种:rts型。* j' o- I8 w) q% f* }$ M
和二维做法差不多,把地图分为很多Block,每块Block可能又由m*n个Tile组成。每块Block使用一张纹理。适合rts等俯视类型游戏,《魔兽3》、《魔域帝国》用到。: Z0 M; ~  m# Q6 l
优点:图像精细,适合表现细致的场景。1 p: O+ n; D2 c5 h2 f% L
缺点:渲染时纹理切换频繁。没法做大面积LOD(Level of Detail),LOD被限制在Block内。由于Block边缘顶点纹理坐标问题,导致Block间没法共用顶点。  W" R2 l1 y" q& x

) A1 `. c: I/ Y7 {' \* a, B地貌间过渡处理: 如草地过渡到土地,简单的方法是让美术做好所有可能用到的不同地貌过渡的图片,程序计算拼接。复杂点的做法是程序计算纹理融合,在渲染是用多层纹理来解决过渡问题,《Empire Earth》,《C&C将军》使用类似做法。1 a$ B% H# ], c2 A5 x
& K- d7 f" B) {, p0 R( ^6 q7 Q
特效处理:$ h0 z: _+ s$ O& K0 n0 G7 R& Y
水深效果:使用顶点色形成水下体积雾效果。
5 I5 `: P" G0 a4 R# n
' m5 u! ?' F& p4 Y0 P; ~1 \8 D; Q**第二种:fps型。' Q1 J' ~8 D& I8 }$ L) G& h
整个地形用一张基本纹理(如:1024*1024)铺满,这张纹理是由程序计算生成(Terrain Texture Generation)。适合室外大场景游戏,如室外fps,飞行模拟。《Battle Field 1942》用到。
' C! R: C, U7 o4 S% F+ T  X优点:任意的LOD范围。无纹理切换问题。可以把计算好的地形LightMap融入基本纹理,一次渲染。
) g$ z+ N% U# ]' S' Q缺点:图像精度不够,解决方法是在渲染时上面加一层细节贴图,如:BumpMap,《Ground Control》用到。
  c6 c5 d% }" }9 O$ T5 u# J
. Z; S1 a+ o5 a( ]7 w*下面是一些常见的问题
7 E" a; G- O& c# S, Q+ j5 ]3 E2 b* c- k7 |3 {0 d6 O' c  ?' o& n
**纹理生成计算方法' @0 b- _3 J6 b; ]* m
基本纹理每点像素由所处的海拔高度和坡度约束计算而得。可以理解为有一张横坐标为高度,纵坐标为坡度的纹理表,每点像素查表而来。资料见后。2 Z* a) F. W/ _
6 U( o8 n$ n$ [8 E6 ~
**地形LightMap
9 m# Q( u% E% G+ h8 T) g$ p明暗(Shading):首先计算每个顶点的平均法向量,注意是共点平面的平均法向量,而不是某个面的法向量,然后用你的光照模型计算公式计算该点光照强度,如:I = cos<light,normal>*Isun + ambient。顶点间光照用插值计算,如法向插值phong算法。
7 b% G, F7 t9 Q% G阴影(Shadow):没看到太好的算法,一般光线求交算法速度太慢,目前我的想法是用硬件+ K- @- V1 H! A6 R
作ShadowVolume,渲染到一张纹理,然后保存。如果你有好的方法请告诉我。# B, I) m9 k# N

1 g$ l/ z$ t4 E5 A- J**物体阴影+ [; J6 x) F- g3 r; V
对静态物体,如房屋可事先渲染好融入Terrain LightMap。
+ h+ Q$ }8 Y3 ?7 v9 m对动态物体,可用Projection Shadow,简单说就是从光源方向把物体影子渲染到一张纹理,然后通过使用纹理坐标生成(TexCoordGen)和修改相应Texture Coordinates Matrix,把这张图贴到地面渲染。
( J* k5 j& n! L8 J5 t, O( S2 {* w6 x
( q0 i  m. L- |**地形渲染
  z5 K: t8 O' k7 O8 ?用Indexed方式按块渲染,注意顶点提交顺序,增加GPU Vertex Cache命中率。如果有LOD,因为每次顶点数据是变化的,d3d实现时用Dynamic Vertex Buffer,把顶点放入AGP内存。
$ u2 S' B* H. p5 |# f: N) h: c, E/ ^( `/ S9 h. c. p
**LOD(Level of Detail)  d3 K$ \) }8 w0 n: V9 P2 h
ROAM算法不适合现代硬件加速显卡,不要用。8 V3 R2 i7 ~: J% Q  a: X
可以看一下GeomMipMap LOD和T-Strip LOD。网址见后。7 q. \& O3 r9 N
6 [$ ?3 I; x: j
**射线与地形求交算法
4 x) q* r. d' ~. `$ e0 h把射线垂直投影到2d地面网格,顺着射线方向检测经过的每个格子,如果光线在格子里面的最低处大于格子四个顶点的最高处,则不可能有交点。6 l! C- K; F1 N" ^8 G5 d' l
+ z) {. }" g7 j& f
资料:' V, {7 A6 W7 `' D/ c- q
T-Strip LOD: http://chat.carleton.ca/~eszoka/tstriplod/tstrip.htm: p+ t" B1 G; Z6 x
GeoMipMap LOD: http://www.flipcode.com/tutorials/geomipmaps.pdf
; [! z0 L' }5 X/ i! ]' `6 uTerrainTextureGenerator(Full Source Code):http://www.insanesoftware.de/index.php?page=freetools/terrain.php
; ~4 F, ~- E. }( _! u
' O# o# _, V1 A) ?" O' x. o# O" U1 ~1 emy email: skull@hardcore3d.net
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-10-1 22:03 , Processed in 0.017714 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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