|
|
* 地形纹理7 A6 y, ^/ A: A+ B9 N- U& X
大概分两种类型:rts型和fps型
- _( N: y+ w( ^* P2 {
$ W- F( t4 i: N4 @( c& B t**第一种:rts型。
% c/ h3 U8 A6 A! c0 [和二维做法差不多,把地图分为很多Block,每块Block可能又由m*n个Tile组成。每块Block使用一张纹理。适合rts等俯视类型游戏,《魔兽3》、《魔域帝国》用到。% p. H/ C# t3 H
优点:图像精细,适合表现细致的场景。
1 j$ z. o6 Q# \* S& v缺点:渲染时纹理切换频繁。没法做大面积LOD(Level of Detail),LOD被限制在Block内。由于Block边缘顶点纹理坐标问题,导致Block间没法共用顶点。1 J8 h. Z: J- V/ k
( C, L8 o/ n+ j, @# p f+ \7 b2 [
地貌间过渡处理: 如草地过渡到土地,简单的方法是让美术做好所有可能用到的不同地貌过渡的图片,程序计算拼接。复杂点的做法是程序计算纹理融合,在渲染是用多层纹理来解决过渡问题,《Empire Earth》,《C&C将军》使用类似做法。% T( h: `8 e# }5 ?6 w M9 V* W6 j# ^
. B/ U* [: D; h: E& {9 I: }特效处理:6 J! J* c7 l$ B2 g
水深效果:使用顶点色形成水下体积雾效果。7 C0 F0 G2 `0 {$ [0 L9 }# k
9 g% c! j& {$ _9 q, e* Q# ?**第二种:fps型。
* J+ B1 L. i! W- y5 j D/ P整个地形用一张基本纹理(如:1024*1024)铺满,这张纹理是由程序计算生成(Terrain Texture Generation)。适合室外大场景游戏,如室外fps,飞行模拟。《Battle Field 1942》用到。; O1 _# j1 g' `: g
优点:任意的LOD范围。无纹理切换问题。可以把计算好的地形LightMap融入基本纹理,一次渲染。
# X6 x3 D* o' c' i2 j1 \; w缺点:图像精度不够,解决方法是在渲染时上面加一层细节贴图,如:BumpMap,《Ground Control》用到。
! A# \. R4 \2 G. \' k, W! E
& O1 U1 J y3 d7 h*下面是一些常见的问题
9 F; v1 J6 e) @. b3 z1 K+ L7 x% z1 i* z) d. n) ^6 G( C! ^
**纹理生成计算方法
, l+ [7 m' P& \4 ~基本纹理每点像素由所处的海拔高度和坡度约束计算而得。可以理解为有一张横坐标为高度,纵坐标为坡度的纹理表,每点像素查表而来。资料见后。* l' d( E4 c6 z6 B% H+ g
5 g3 B9 H. y# a2 l( V. m) n) {3 {: J**地形LightMap* W! g- Y) U) p$ P# V" b+ E& A
明暗(Shading):首先计算每个顶点的平均法向量,注意是共点平面的平均法向量,而不是某个面的法向量,然后用你的光照模型计算公式计算该点光照强度,如:I = cos<light,normal>*Isun + ambient。顶点间光照用插值计算,如法向插值phong算法。3 ~$ [+ k5 h) `/ R
阴影(Shadow):没看到太好的算法,一般光线求交算法速度太慢,目前我的想法是用硬件
) c: ]1 Q" r1 M: d; q# ^作ShadowVolume,渲染到一张纹理,然后保存。如果你有好的方法请告诉我。5 N" I8 S, a' R& l; |5 X0 n
7 ]2 ~% V3 F) l1 R2 |1 s/ x6 A
**物体阴影6 D- d5 \- ], `# e% _, t& ^
对静态物体,如房屋可事先渲染好融入Terrain LightMap。
6 o0 U; V& T m' \/ u# X2 i% c对动态物体,可用Projection Shadow,简单说就是从光源方向把物体影子渲染到一张纹理,然后通过使用纹理坐标生成(TexCoordGen)和修改相应Texture Coordinates Matrix,把这张图贴到地面渲染。
# m: O6 j( H/ w+ e9 n' Z- ]
! ^$ }* W* F5 E. `6 K**地形渲染: {" W" Q2 {# q+ g: p
用Indexed方式按块渲染,注意顶点提交顺序,增加GPU Vertex Cache命中率。如果有LOD,因为每次顶点数据是变化的,d3d实现时用Dynamic Vertex Buffer,把顶点放入AGP内存。1 _# ]* i' O6 m7 ]0 x
% P/ M! ~& w: P: G. b**LOD(Level of Detail)
* E# a# A# ]! k+ }, F& IROAM算法不适合现代硬件加速显卡,不要用。
$ U+ ` L+ ? p$ Q, Z+ g2 ~可以看一下GeomMipMap LOD和T-Strip LOD。网址见后。* T/ U: e X1 y% U# @$ G
; o3 N3 L6 e' ~& T**射线与地形求交算法: s! x& y1 `- V$ E0 w# o" i
把射线垂直投影到2d地面网格,顺着射线方向检测经过的每个格子,如果光线在格子里面的最低处大于格子四个顶点的最高处,则不可能有交点。
3 Q; C/ ?6 j1 A
; k v% i1 A* C7 l资料:
+ b# N% ?" G9 F. \T-Strip LOD: http://chat.carleton.ca/~eszoka/tstriplod/tstrip.htm
& k' ~" X. I5 {8 G' }6 J4 DGeoMipMap LOD: http://www.flipcode.com/tutorials/geomipmaps.pdf" q: d/ i' `7 z; `2 Z0 v% z
TerrainTextureGenerator(Full Source Code):http://www.insanesoftware.de/index.php?page=freetools/terrain.php
* F5 U5 v9 o% }/ S
- v j. F* s5 X+ G kmy email: skull@hardcore3d.net |
|