|
|
* 地形纹理' ~' R4 j9 F' `/ C$ n2 J, o
大概分两种类型:rts型和fps型. m# `6 v! L% h' W9 i/ f
& }" O% S! V) n" O' V2 H# v( K) `' F**第一种:rts型。
( j+ p/ j1 d0 C/ L4 X和二维做法差不多,把地图分为很多Block,每块Block可能又由m*n个Tile组成。每块Block使用一张纹理。适合rts等俯视类型游戏,《魔兽3》、《魔域帝国》用到。* e/ r8 X7 ]1 J. q1 \7 a
优点:图像精细,适合表现细致的场景。; A* `$ J4 b/ i
缺点:渲染时纹理切换频繁。没法做大面积LOD(Level of Detail),LOD被限制在Block内。由于Block边缘顶点纹理坐标问题,导致Block间没法共用顶点。
: ^8 A; @& B; b' {# W' y4 N) k4 U% `/ w! d4 ]! P! `
地貌间过渡处理: 如草地过渡到土地,简单的方法是让美术做好所有可能用到的不同地貌过渡的图片,程序计算拼接。复杂点的做法是程序计算纹理融合,在渲染是用多层纹理来解决过渡问题,《Empire Earth》,《C&C将军》使用类似做法。* e+ e: _9 w7 n8 l+ t W! S. ]( j# Q
$ h. n# q* g* q4 d n# n( `1 U
特效处理:2 X0 x3 D1 f0 J8 c: m N8 M
水深效果:使用顶点色形成水下体积雾效果。: X. y5 C7 J% U0 c
7 u7 h# P" r# U! t! ]) p% r+ ^**第二种:fps型。
+ s5 D: y+ B; r整个地形用一张基本纹理(如:1024*1024)铺满,这张纹理是由程序计算生成(Terrain Texture Generation)。适合室外大场景游戏,如室外fps,飞行模拟。《Battle Field 1942》用到。
. [6 M V2 L8 @$ b优点:任意的LOD范围。无纹理切换问题。可以把计算好的地形LightMap融入基本纹理,一次渲染。7 I- {0 \" |* k2 I+ ~0 n
缺点:图像精度不够,解决方法是在渲染时上面加一层细节贴图,如:BumpMap,《Ground Control》用到。
4 O5 O# E3 Q7 t$ c: O& I6 V
- |" J2 U0 r- X- o4 z*下面是一些常见的问题) p# e) M- P4 m' g8 o
8 J, K b7 Z& Z- i; m& Z**纹理生成计算方法6 J, q5 E, P$ L8 @# K2 w
基本纹理每点像素由所处的海拔高度和坡度约束计算而得。可以理解为有一张横坐标为高度,纵坐标为坡度的纹理表,每点像素查表而来。资料见后。4 J+ a, O# S9 K
% k, W2 D, p, q1 o
**地形LightMap
( _' p! T& J0 _- ~& T' [明暗(Shading):首先计算每个顶点的平均法向量,注意是共点平面的平均法向量,而不是某个面的法向量,然后用你的光照模型计算公式计算该点光照强度,如:I = cos<light,normal>*Isun + ambient。顶点间光照用插值计算,如法向插值phong算法。+ @9 }, {& K* @& ?; p
阴影(Shadow):没看到太好的算法,一般光线求交算法速度太慢,目前我的想法是用硬件
, {! h6 V: r" q作ShadowVolume,渲染到一张纹理,然后保存。如果你有好的方法请告诉我。
6 A7 z5 P7 N+ f: ^* x. M7 o% F: S1 J
**物体阴影3 d$ N4 j# R( {" X4 Q
对静态物体,如房屋可事先渲染好融入Terrain LightMap。
: o. f6 v% } S2 G1 C: s对动态物体,可用Projection Shadow,简单说就是从光源方向把物体影子渲染到一张纹理,然后通过使用纹理坐标生成(TexCoordGen)和修改相应Texture Coordinates Matrix,把这张图贴到地面渲染。6 y6 t4 _9 q% U$ U1 z( ]+ \1 Y& M1 X
! }9 I4 e3 w3 a7 b2 }. g |**地形渲染
6 f2 y3 M& h) y' ~. ^7 y用Indexed方式按块渲染,注意顶点提交顺序,增加GPU Vertex Cache命中率。如果有LOD,因为每次顶点数据是变化的,d3d实现时用Dynamic Vertex Buffer,把顶点放入AGP内存。) [2 r: S: c/ h% r# v5 s
) Y+ R! q- V. p: a0 e E# N
**LOD(Level of Detail)& K7 m0 Y/ P7 K$ M
ROAM算法不适合现代硬件加速显卡,不要用。1 B/ K {0 g9 D1 `# a% v& n
可以看一下GeomMipMap LOD和T-Strip LOD。网址见后。- i. `0 b, ?2 p, m. o$ p$ M8 Y/ J
* W/ X& _; i9 d7 T5 X% n; n2 [
**射线与地形求交算法4 [) a' Z; H' Q' s2 [$ t- E
把射线垂直投影到2d地面网格,顺着射线方向检测经过的每个格子,如果光线在格子里面的最低处大于格子四个顶点的最高处,则不可能有交点。/ B, L" B. d0 h s& B# _7 ]
+ j1 k [) `+ M! w! t3 n. v
资料:
9 A2 Q: C4 M" b+ h& h0 T: YT-Strip LOD: http://chat.carleton.ca/~eszoka/tstriplod/tstrip.htm
: m3 O9 a# |! P3 iGeoMipMap LOD: http://www.flipcode.com/tutorials/geomipmaps.pdf
# v& l4 `5 Z; J* b6 U6 RTerrainTextureGenerator(Full Source Code):http://www.insanesoftware.de/index.php?page=freetools/terrain.php' J$ D: J4 q% e9 z i5 P+ X& H
( H/ A% L+ i3 Hmy email: skull@hardcore3d.net |
|