|
* 地形纹理
! R% {' l; E. Y Y大概分两种类型:rts型和fps型
5 f5 w( v! q/ w: f. f
2 `0 ]( Z" h6 ^+ S% S) Z, X**第一种:rts型。
9 f4 O% b0 ^. e. y和二维做法差不多,把地图分为很多Block,每块Block可能又由m*n个Tile组成。每块Block使用一张纹理。适合rts等俯视类型游戏,《魔兽3》、《魔域帝国》用到。' A9 b a* i& U& z' @
优点:图像精细,适合表现细致的场景。 z- [; G9 i, W0 m+ Y
缺点:渲染时纹理切换频繁。没法做大面积LOD(Level of Detail),LOD被限制在Block内。由于Block边缘顶点纹理坐标问题,导致Block间没法共用顶点。
# L" J, Q. ~$ o& R% _) p# m- l
& D4 n* c, g; I, ~地貌间过渡处理: 如草地过渡到土地,简单的方法是让美术做好所有可能用到的不同地貌过渡的图片,程序计算拼接。复杂点的做法是程序计算纹理融合,在渲染是用多层纹理来解决过渡问题,《Empire Earth》,《C&C将军》使用类似做法。
p$ z3 |1 p: }1 k z" X
% d: v& ~% Z( U8 b5 G# C, b特效处理:, @/ |: v4 l' Z1 M1 E2 K
水深效果:使用顶点色形成水下体积雾效果。
7 z9 S- v4 T4 G/ J9 s
! I( Z( e, T" R. I, q**第二种:fps型。3 g: z o# k! W: Z1 H
整个地形用一张基本纹理(如:1024*1024)铺满,这张纹理是由程序计算生成(Terrain Texture Generation)。适合室外大场景游戏,如室外fps,飞行模拟。《Battle Field 1942》用到。
* \- h- ], q/ y# y优点:任意的LOD范围。无纹理切换问题。可以把计算好的地形LightMap融入基本纹理,一次渲染。: \2 X/ m5 l4 ]" Z. l; R, H7 r& H8 U+ {
缺点:图像精度不够,解决方法是在渲染时上面加一层细节贴图,如:BumpMap,《Ground Control》用到。
- X2 {4 g' N1 ^: w1 ~
: z+ _' l+ T$ p- G7 D8 \*下面是一些常见的问题( Q d& n- R g* N3 `7 q
% f9 {1 R x# r
**纹理生成计算方法
8 Q$ w' ~; @! U基本纹理每点像素由所处的海拔高度和坡度约束计算而得。可以理解为有一张横坐标为高度,纵坐标为坡度的纹理表,每点像素查表而来。资料见后。
3 U6 R/ J. Z f K0 D- d5 m/ c7 t
8 N5 ]1 K3 i5 X- z5 a: X, Z5 u**地形LightMap1 I) \$ o5 `( _3 ^6 t
明暗(Shading):首先计算每个顶点的平均法向量,注意是共点平面的平均法向量,而不是某个面的法向量,然后用你的光照模型计算公式计算该点光照强度,如:I = cos<light,normal>*Isun + ambient。顶点间光照用插值计算,如法向插值phong算法。2 D* P* k y1 _) r8 O- z
阴影(Shadow):没看到太好的算法,一般光线求交算法速度太慢,目前我的想法是用硬件
6 u) s' R& y+ o3 E9 N g+ m: m作ShadowVolume,渲染到一张纹理,然后保存。如果你有好的方法请告诉我。
9 A6 |6 {* c& ^0 k* z) O; n t7 `, {. a/ ^" b7 A X
**物体阴影9 |5 c& F$ S' ~" g* C- c
对静态物体,如房屋可事先渲染好融入Terrain LightMap。" ]( }/ l1 y5 r$ N& j6 G
对动态物体,可用Projection Shadow,简单说就是从光源方向把物体影子渲染到一张纹理,然后通过使用纹理坐标生成(TexCoordGen)和修改相应Texture Coordinates Matrix,把这张图贴到地面渲染。0 G0 O/ g- b7 B" s- G4 q6 x! P% O$ k- h8 t
5 b/ z- m* ]7 q% x**地形渲染
* E8 }9 m6 V$ ^* w# f9 L7 `用Indexed方式按块渲染,注意顶点提交顺序,增加GPU Vertex Cache命中率。如果有LOD,因为每次顶点数据是变化的,d3d实现时用Dynamic Vertex Buffer,把顶点放入AGP内存。6 R' c* W8 ?& u
1 v, k$ t ^% j% C" o; U" i5 X
**LOD(Level of Detail)3 ?+ T, e" N& v" d( m! B8 e- m
ROAM算法不适合现代硬件加速显卡,不要用。
! C5 O6 z/ K) z" i' G7 {可以看一下GeomMipMap LOD和T-Strip LOD。网址见后。' x8 z% @* e0 w
/ [; m5 N, a2 B2 x5 E$ ~( q1 x& ~
**射线与地形求交算法- f+ F: a: q+ R) y7 I. O" j
把射线垂直投影到2d地面网格,顺着射线方向检测经过的每个格子,如果光线在格子里面的最低处大于格子四个顶点的最高处,则不可能有交点。
9 p5 C8 _( Q9 s. K5 @) ~7 U, H/ C+ R8 W+ Q: ]5 p2 q
资料:6 e" {+ z+ g! a/ N% L
T-Strip LOD: http://chat.carleton.ca/~eszoka/tstriplod/tstrip.htm, p9 v O2 s' Z( _0 K; U
GeoMipMap LOD: http://www.flipcode.com/tutorials/geomipmaps.pdf7 x v, M3 A: S* H. C. `/ h0 p
TerrainTextureGenerator(Full Source Code):http://www.insanesoftware.de/index.php?page=freetools/terrain.php
5 {0 A# J: r c8 J! ^% O( F2 `) s e% m/ A0 i F6 e" A% {
my email: skull@hardcore3d.net |
|