|
* 地形纹理, ^% r( M6 U9 W% U' s& Q5 }, _
大概分两种类型:rts型和fps型
0 C- u2 l( x ?! z# m5 ]8 `" T; O; g( y J1 m6 w& W, D4 q
**第一种:rts型。
9 f/ X: U' {4 V" `2 j; J和二维做法差不多,把地图分为很多Block,每块Block可能又由m*n个Tile组成。每块Block使用一张纹理。适合rts等俯视类型游戏,《魔兽3》、《魔域帝国》用到。
. l% Y* R( c% M" _ c/ g" @8 r! a优点:图像精细,适合表现细致的场景。( O" ^ r* e& h+ A; q! {/ h: [4 E
缺点:渲染时纹理切换频繁。没法做大面积LOD(Level of Detail),LOD被限制在Block内。由于Block边缘顶点纹理坐标问题,导致Block间没法共用顶点。
6 O3 }& J& l# }+ `2 b# B5 X/ i5 B9 m% }8 _" ]8 g
地貌间过渡处理: 如草地过渡到土地,简单的方法是让美术做好所有可能用到的不同地貌过渡的图片,程序计算拼接。复杂点的做法是程序计算纹理融合,在渲染是用多层纹理来解决过渡问题,《Empire Earth》,《C&C将军》使用类似做法。9 f' f( g# l K C+ U5 q( F
/ A: w* G. ~3 N5 y4 _
特效处理:9 Z$ B! W0 m& ~3 N
水深效果:使用顶点色形成水下体积雾效果。% ^: [& M! X; I6 K8 R! Z+ `
4 k( J: g1 s4 ^: s# A- @**第二种:fps型。0 H' b) d5 B5 ]! N( c
整个地形用一张基本纹理(如:1024*1024)铺满,这张纹理是由程序计算生成(Terrain Texture Generation)。适合室外大场景游戏,如室外fps,飞行模拟。《Battle Field 1942》用到。. ]* v4 K [& Q7 s* h0 J! l, n
优点:任意的LOD范围。无纹理切换问题。可以把计算好的地形LightMap融入基本纹理,一次渲染。3 W/ U; [' J8 a7 j' p, ?4 Y6 T4 d
缺点:图像精度不够,解决方法是在渲染时上面加一层细节贴图,如:BumpMap,《Ground Control》用到。" }/ B9 n: L! k" e6 y
7 h r7 z% K$ x( y- L
*下面是一些常见的问题8 f# u, R- Z+ o) U8 S5 u! M k8 `7 n
6 O# O. T- D' U @/ c: {% a
**纹理生成计算方法
( }/ C, W7 y2 {4 S- |基本纹理每点像素由所处的海拔高度和坡度约束计算而得。可以理解为有一张横坐标为高度,纵坐标为坡度的纹理表,每点像素查表而来。资料见后。' u: F4 Z0 s k
: Z! u" I# }& Z**地形LightMap3 ?; S! Z# K- F( A. u; F- |1 A
明暗(Shading):首先计算每个顶点的平均法向量,注意是共点平面的平均法向量,而不是某个面的法向量,然后用你的光照模型计算公式计算该点光照强度,如:I = cos<light,normal>*Isun + ambient。顶点间光照用插值计算,如法向插值phong算法。1 S# s' w6 {' J; p7 m' K
阴影(Shadow):没看到太好的算法,一般光线求交算法速度太慢,目前我的想法是用硬件
& m8 B6 ~3 f% s" `" y9 {% E作ShadowVolume,渲染到一张纹理,然后保存。如果你有好的方法请告诉我。
1 o' W; a* [: c+ ~
6 T/ I% P) S3 ~& _ Y# H3 _7 J**物体阴影5 @: Q5 S, g6 J
对静态物体,如房屋可事先渲染好融入Terrain LightMap。
& w, Y; p( [3 m对动态物体,可用Projection Shadow,简单说就是从光源方向把物体影子渲染到一张纹理,然后通过使用纹理坐标生成(TexCoordGen)和修改相应Texture Coordinates Matrix,把这张图贴到地面渲染。
$ N1 H8 q. S; _5 b5 ?% z$ i" M, E- Z0 ^- t$ F( ?; M, s0 y1 M
**地形渲染6 w0 N) K! N, _: e, M. I4 s8 D9 _. x
用Indexed方式按块渲染,注意顶点提交顺序,增加GPU Vertex Cache命中率。如果有LOD,因为每次顶点数据是变化的,d3d实现时用Dynamic Vertex Buffer,把顶点放入AGP内存。
. }4 z! p k+ y* g3 x# Y5 ? I. {- T) c4 _
**LOD(Level of Detail)
, u& N- j% m. @$ H7 I& S0 d, HROAM算法不适合现代硬件加速显卡,不要用。+ f* ~" [, R x2 i' n' k8 _0 H+ H
可以看一下GeomMipMap LOD和T-Strip LOD。网址见后。
% x+ n6 Q# w q
) M' w( b: \ y" X7 i" m**射线与地形求交算法( G8 z$ W. \! K
把射线垂直投影到2d地面网格,顺着射线方向检测经过的每个格子,如果光线在格子里面的最低处大于格子四个顶点的最高处,则不可能有交点。& X j! x+ B# V+ Q! h- L0 R
6 o8 S( M# ]8 Z" S资料:) y- q( c* q' r! [
T-Strip LOD: http://chat.carleton.ca/~eszoka/tstriplod/tstrip.htm6 {1 X( ?/ U2 @/ T! f, s v0 Y* g' W
GeoMipMap LOD: http://www.flipcode.com/tutorials/geomipmaps.pdf
, G3 [. W2 L* E8 q$ WTerrainTextureGenerator(Full Source Code):http://www.insanesoftware.de/index.php?page=freetools/terrain.php* y- m7 g7 j Y: T) }" J: Y
3 q- y4 A0 b$ r" L, Z* s) @/ {' k
my email: skull@hardcore3d.net |
|