|
|
* 地形纹理8 V- E, r, U9 p6 M
大概分两种类型:rts型和fps型
( k x7 G5 N- @+ z: M7 A: ~
" Q4 X0 X- C; [( y**第一种:rts型。
; s0 {. Q W. v3 ], [2 H* R6 d- N% P和二维做法差不多,把地图分为很多Block,每块Block可能又由m*n个Tile组成。每块Block使用一张纹理。适合rts等俯视类型游戏,《魔兽3》、《魔域帝国》用到。
$ k7 S! Y( P' z% v5 S# E: d. P优点:图像精细,适合表现细致的场景。
9 h# h# K4 m7 e& g7 p缺点:渲染时纹理切换频繁。没法做大面积LOD(Level of Detail),LOD被限制在Block内。由于Block边缘顶点纹理坐标问题,导致Block间没法共用顶点。
y7 t4 V# ~' j, I
* x; u% P- e: j- K1 E地貌间过渡处理: 如草地过渡到土地,简单的方法是让美术做好所有可能用到的不同地貌过渡的图片,程序计算拼接。复杂点的做法是程序计算纹理融合,在渲染是用多层纹理来解决过渡问题,《Empire Earth》,《C&C将军》使用类似做法。3 D! e* ?5 B0 @$ p: e
. A3 ?, R& F1 W* M4 N. I6 L
特效处理:
. b/ W* w6 V7 ^: A; \! p) M0 y4 `水深效果:使用顶点色形成水下体积雾效果。8 D! X6 r2 c3 l4 n3 T: g
! k2 j0 X U, x- Z**第二种:fps型。( @4 X# k, v, |
整个地形用一张基本纹理(如:1024*1024)铺满,这张纹理是由程序计算生成(Terrain Texture Generation)。适合室外大场景游戏,如室外fps,飞行模拟。《Battle Field 1942》用到。; N9 C' N+ \. D& u7 y' L
优点:任意的LOD范围。无纹理切换问题。可以把计算好的地形LightMap融入基本纹理,一次渲染。
4 U4 x/ w: r' u2 t# U缺点:图像精度不够,解决方法是在渲染时上面加一层细节贴图,如:BumpMap,《Ground Control》用到。3 i" u7 |* {8 x. r+ C
: E: P7 T |$ o: z+ V*下面是一些常见的问题# @6 `% g. z8 q7 y; n
2 q+ r0 {' R. _! `" k9 }- j" Z**纹理生成计算方法
* i+ y# w8 ~; Y基本纹理每点像素由所处的海拔高度和坡度约束计算而得。可以理解为有一张横坐标为高度,纵坐标为坡度的纹理表,每点像素查表而来。资料见后。! i1 n0 F$ T6 {5 N
; k9 E1 @+ Q- A5 O
**地形LightMap
8 |1 _) B6 B5 U) x* D4 I1 X明暗(Shading):首先计算每个顶点的平均法向量,注意是共点平面的平均法向量,而不是某个面的法向量,然后用你的光照模型计算公式计算该点光照强度,如:I = cos<light,normal>*Isun + ambient。顶点间光照用插值计算,如法向插值phong算法。$ ~3 h7 J8 C8 Q% {
阴影(Shadow):没看到太好的算法,一般光线求交算法速度太慢,目前我的想法是用硬件
8 u) V$ |+ }; i0 A作ShadowVolume,渲染到一张纹理,然后保存。如果你有好的方法请告诉我。
) b& u7 x$ A/ W# O" X; P$ C; A2 m
**物体阴影; J( G$ a3 Q W& L/ h
对静态物体,如房屋可事先渲染好融入Terrain LightMap。' j6 [& z# k8 t
对动态物体,可用Projection Shadow,简单说就是从光源方向把物体影子渲染到一张纹理,然后通过使用纹理坐标生成(TexCoordGen)和修改相应Texture Coordinates Matrix,把这张图贴到地面渲染。
5 n: ?- l9 B5 S# g' s. h/ H$ o% ?6 |; O1 D* T; g
**地形渲染% n5 F+ P4 W w+ d& D; V
用Indexed方式按块渲染,注意顶点提交顺序,增加GPU Vertex Cache命中率。如果有LOD,因为每次顶点数据是变化的,d3d实现时用Dynamic Vertex Buffer,把顶点放入AGP内存。( d/ t: M) K7 B! i% G
9 N% R; k( i, V& }1 E( c/ {) t A**LOD(Level of Detail): D. x& E! I0 S8 v/ k
ROAM算法不适合现代硬件加速显卡,不要用。0 I! v5 h5 ?" B2 E
可以看一下GeomMipMap LOD和T-Strip LOD。网址见后。
, f+ p ~4 V1 v+ p
% D5 C, G& t4 C: y**射线与地形求交算法* u9 k" o; g$ o; Z5 ]
把射线垂直投影到2d地面网格,顺着射线方向检测经过的每个格子,如果光线在格子里面的最低处大于格子四个顶点的最高处,则不可能有交点。5 ?( W. W; R% v' f' [/ O$ } K
; p# s, Q% X: m! P% q X资料:
5 J1 F7 X( q7 ^T-Strip LOD: http://chat.carleton.ca/~eszoka/tstriplod/tstrip.htm) o' F" b! |+ x( m( c
GeoMipMap LOD: http://www.flipcode.com/tutorials/geomipmaps.pdf
( w' l1 u s3 `$ k# |TerrainTextureGenerator(Full Source Code):http://www.insanesoftware.de/index.php?page=freetools/terrain.php, `- @6 o! r1 c5 \, A
, ?) v. u( n5 }: p9 c
my email: skull@hardcore3d.net |
|