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

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

[复制链接]
发表于 2005-3-26 19:40:09 | 显示全部楼层 |阅读模式
  * 地形纹理
& e0 C1 ?0 x! z' P% F' ?1 C/ [大概分两种类型:rts型和fps型
( ^& _+ l2 [% G/ M
# T4 w6 j' b6 C) b, E6 o+ u) b8 |**第一种:rts型。
# a1 s6 E0 c! ]" E+ v5 {+ n- i和二维做法差不多,把地图分为很多Block,每块Block可能又由m*n个Tile组成。每块Block使用一张纹理。适合rts等俯视类型游戏,《魔兽3》、《魔域帝国》用到。
0 N3 k1 F0 {+ k  y1 y优点:图像精细,适合表现细致的场景。( k' j5 F9 A+ `% m: [3 e
缺点:渲染时纹理切换频繁。没法做大面积LOD(Level of Detail),LOD被限制在Block内。由于Block边缘顶点纹理坐标问题,导致Block间没法共用顶点。2 ~( Z3 t; B/ k1 U- `# C
1 o6 r# r# v' F, w4 y6 y* b
地貌间过渡处理: 如草地过渡到土地,简单的方法是让美术做好所有可能用到的不同地貌过渡的图片,程序计算拼接。复杂点的做法是程序计算纹理融合,在渲染是用多层纹理来解决过渡问题,《Empire Earth》,《C&C将军》使用类似做法。
0 Z0 l) ^) L6 u4 j" S- D  W0 Y9 M9 S; ]% u: _+ n
特效处理:
  N" o* F4 {% n, c+ B水深效果:使用顶点色形成水下体积雾效果。
% ?) R: I" Y5 q! n6 _
7 \+ L4 X# X/ z, N+ Y**第二种:fps型。& t% `6 ~3 i) w( W  f9 B
整个地形用一张基本纹理(如:1024*1024)铺满,这张纹理是由程序计算生成(Terrain Texture Generation)。适合室外大场景游戏,如室外fps,飞行模拟。《Battle Field 1942》用到。
8 b* o: p  @4 I6 |优点:任意的LOD范围。无纹理切换问题。可以把计算好的地形LightMap融入基本纹理,一次渲染。
! ]# C# l  u  N1 M缺点:图像精度不够,解决方法是在渲染时上面加一层细节贴图,如:BumpMap,《Ground Control》用到。* S  r$ x1 A9 T# I! w# [' ~
7 C6 D4 \6 U" f* [2 A
*下面是一些常见的问题
% N# u, q2 N& z. }; o9 }* Y# d: H. h( r& C/ a9 d
**纹理生成计算方法+ o/ Q: _5 j9 Q3 u
基本纹理每点像素由所处的海拔高度和坡度约束计算而得。可以理解为有一张横坐标为高度,纵坐标为坡度的纹理表,每点像素查表而来。资料见后。
) e; I: ^) A; S/ n, Y. e
! J% ^/ D" y) w. ?: {) P**地形LightMap
9 D% U2 I7 H8 _0 T* ^6 P明暗(Shading):首先计算每个顶点的平均法向量,注意是共点平面的平均法向量,而不是某个面的法向量,然后用你的光照模型计算公式计算该点光照强度,如:I = cos<light,normal>*Isun + ambient。顶点间光照用插值计算,如法向插值phong算法。+ {+ t, |- c+ t" ?! z  M6 \3 Q  A
阴影(Shadow):没看到太好的算法,一般光线求交算法速度太慢,目前我的想法是用硬件7 G" y) e3 m% @: a: F! g  F5 A! y
作ShadowVolume,渲染到一张纹理,然后保存。如果你有好的方法请告诉我。' u6 E0 A+ P4 O9 R& _

, ]/ ^/ I1 J- g& \  o**物体阴影1 f9 Z' x, l, d) s9 [; i: m7 Z( h( A
对静态物体,如房屋可事先渲染好融入Terrain LightMap。
+ g! L9 D7 V# ?8 v/ T& q# N对动态物体,可用Projection Shadow,简单说就是从光源方向把物体影子渲染到一张纹理,然后通过使用纹理坐标生成(TexCoordGen)和修改相应Texture Coordinates Matrix,把这张图贴到地面渲染。
9 E  O" _; a/ N6 y
+ V# s8 F) X4 J5 D**地形渲染1 r5 c9 A1 Y8 k4 G' c
用Indexed方式按块渲染,注意顶点提交顺序,增加GPU Vertex Cache命中率。如果有LOD,因为每次顶点数据是变化的,d3d实现时用Dynamic Vertex Buffer,把顶点放入AGP内存。" W" y9 p7 L+ o" I
2 ~! Z: s* B+ R& ~, r/ t
**LOD(Level of Detail)
9 d5 M- F' d( A  g+ _6 ^ROAM算法不适合现代硬件加速显卡,不要用。
" D+ {' y0 c" e可以看一下GeomMipMap LOD和T-Strip LOD。网址见后。5 X# n; P; p4 t, ~; D, p

" p* i0 I2 C& T6 M  H**射线与地形求交算法! }; Y, j9 ~* k8 S5 s8 ?
把射线垂直投影到2d地面网格,顺着射线方向检测经过的每个格子,如果光线在格子里面的最低处大于格子四个顶点的最高处,则不可能有交点。
. t' {6 r7 _8 [' g* n3 Q
9 ]  F; X" t( `2 h资料:" ~  {( U! `7 S( D2 W- O
T-Strip LOD: http://chat.carleton.ca/~eszoka/tstriplod/tstrip.htm
3 \% t7 q* V( ^$ I9 ?; _GeoMipMap LOD: http://www.flipcode.com/tutorials/geomipmaps.pdf
! @" }4 D4 W: X4 L; T" cTerrainTextureGenerator(Full Source Code):http://www.insanesoftware.de/index.php?page=freetools/terrain.php
) N7 y, U4 ~; M  e
* o5 r% ^+ E: x) @1 [# |6 w$ fmy email: skull@hardcore3d.net
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-5-2 10:35 , Processed in 0.018993 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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