|
|
* 地形纹理
* ~. j' T8 X$ e- F, `& o3 w. H大概分两种类型:rts型和fps型* C. @( m! W2 J
5 O6 B7 l# l( B9 g2 L. h. ?
**第一种:rts型。' r' [0 B! J" @3 o$ C
和二维做法差不多,把地图分为很多Block,每块Block可能又由m*n个Tile组成。每块Block使用一张纹理。适合rts等俯视类型游戏,《魔兽3》、《魔域帝国》用到。" c- ~' y; g3 H$ t3 [7 `
优点:图像精细,适合表现细致的场景。& J0 ^ ~' b1 u
缺点:渲染时纹理切换频繁。没法做大面积LOD(Level of Detail),LOD被限制在Block内。由于Block边缘顶点纹理坐标问题,导致Block间没法共用顶点。1 f. `2 Q0 X7 p
+ K3 J: ?' ]9 R s0 ~2 Z地貌间过渡处理: 如草地过渡到土地,简单的方法是让美术做好所有可能用到的不同地貌过渡的图片,程序计算拼接。复杂点的做法是程序计算纹理融合,在渲染是用多层纹理来解决过渡问题,《Empire Earth》,《C&C将军》使用类似做法。" W& Y) m# Z/ W
1 n0 a1 w) b. {* j
特效处理:
4 N) ]5 x k2 i2 P1 r' `水深效果:使用顶点色形成水下体积雾效果。! e* ]# A! J5 A6 f2 }% x
J! f6 z* |6 J**第二种:fps型。2 G9 Z0 J. x8 v
整个地形用一张基本纹理(如:1024*1024)铺满,这张纹理是由程序计算生成(Terrain Texture Generation)。适合室外大场景游戏,如室外fps,飞行模拟。《Battle Field 1942》用到。
6 u. L' h `1 @# c. ?0 m6 \, @优点:任意的LOD范围。无纹理切换问题。可以把计算好的地形LightMap融入基本纹理,一次渲染。
! v# N/ e1 I: p/ l8 z缺点:图像精度不够,解决方法是在渲染时上面加一层细节贴图,如:BumpMap,《Ground Control》用到。
: n7 {( S+ m7 @
0 U7 \0 ~, v3 W7 X9 I }$ z*下面是一些常见的问题
/ X/ n0 W. Z$ o- C+ ^! X5 c, P) p8 A& n7 B; _/ Q' T
**纹理生成计算方法! W( d* |, U, {$ D
基本纹理每点像素由所处的海拔高度和坡度约束计算而得。可以理解为有一张横坐标为高度,纵坐标为坡度的纹理表,每点像素查表而来。资料见后。
( @9 K* v- `3 o3 v- z7 j' |% B4 H& l, i& V8 w' g. G: C
**地形LightMap
6 {- M2 h+ v' @$ F明暗(Shading):首先计算每个顶点的平均法向量,注意是共点平面的平均法向量,而不是某个面的法向量,然后用你的光照模型计算公式计算该点光照强度,如:I = cos<light,normal>*Isun + ambient。顶点间光照用插值计算,如法向插值phong算法。
6 O' ]9 X, Q2 v阴影(Shadow):没看到太好的算法,一般光线求交算法速度太慢,目前我的想法是用硬件
; w9 x$ K4 c2 j' o: L' t+ D作ShadowVolume,渲染到一张纹理,然后保存。如果你有好的方法请告诉我。# Y2 k/ y; N; `& {# _% U; L7 |
( b/ Q. Y' ^; Q. D! @**物体阴影
; l) C! ~% u& ]# R& @& F; u对静态物体,如房屋可事先渲染好融入Terrain LightMap。
* f6 p0 w2 s8 Q5 o$ i对动态物体,可用Projection Shadow,简单说就是从光源方向把物体影子渲染到一张纹理,然后通过使用纹理坐标生成(TexCoordGen)和修改相应Texture Coordinates Matrix,把这张图贴到地面渲染。! ^# H( O% M/ g! k
V% Y9 v* B! B7 o; N N$ }
**地形渲染
; p% {2 s4 b3 i用Indexed方式按块渲染,注意顶点提交顺序,增加GPU Vertex Cache命中率。如果有LOD,因为每次顶点数据是变化的,d3d实现时用Dynamic Vertex Buffer,把顶点放入AGP内存。. O; X/ ~! l0 f Q$ M3 c
1 L3 ~4 s o. P: x
**LOD(Level of Detail)
4 a0 P S7 q& V1 T" L) T% sROAM算法不适合现代硬件加速显卡,不要用。& t+ L' W) V/ s+ S# J+ I
可以看一下GeomMipMap LOD和T-Strip LOD。网址见后。
) p) @" O: O m! j. p( p1 E- E
2 x, ]9 Q3 Z# E. F# k8 I( p' u**射线与地形求交算法
; \) P7 F; D8 f8 `! g4 h3 f把射线垂直投影到2d地面网格,顺着射线方向检测经过的每个格子,如果光线在格子里面的最低处大于格子四个顶点的最高处,则不可能有交点。
% y$ N* }; Q8 i$ ]' ^" p/ _% j3 `4 {& e1 o( {2 U2 J9 Q
资料:
7 B4 D( {+ \3 a" p" q a( Y+ IT-Strip LOD: http://chat.carleton.ca/~eszoka/tstriplod/tstrip.htm1 l* E- r; R$ J x( x& W% G
GeoMipMap LOD: http://www.flipcode.com/tutorials/geomipmaps.pdf
6 r/ o, D2 J( b& n; y8 K$ DTerrainTextureGenerator(Full Source Code):http://www.insanesoftware.de/index.php?page=freetools/terrain.php
; R7 [+ O/ H" |! W6 H# \# A( j( W( T6 F
my email: skull@hardcore3d.net |
|