这次我们要看看地形高地数据是如何储存和处理的。(阅读本文
第1、
第2部分)
《Trigger Rally》的地形高地数据主要资源,形成山地的整体形状,是瑞士阿尔卑斯山地图的真实卫星数据。
terrain4
我写了一个工具把这个数据转化为无缝的1024×1024的16位图像。低8位储存在红色通道里,高8位存在绿色通道里。如下图所示:
nice-boosted
在载入时,游戏把这个图像转化为单通道的32位浮动纹理,然后把赛车跑道曲线(每一条路道的曲线都是不一样的)绘制到这个图像中。
以角秒的速度取样高地数据,以21米对应阿尔卑斯山纬度30米。我把这些数值除以大约3,以缩小游戏中的高山,所以主高地地图的各个象素其实是7.5米x10.8米。
这样的分辨率对于高山是不错的,对于跑道只是刚好,而对于顺畅的驾驶和近景图像,就不太够了。
平滑 第一件要做的事就是修改高地地图。对于图像,线性过滤通常足够平滑了,但对于我们几何体,我们确实需要更高的连续性。这里有几个不同的办法,但我只采用三次厄密特条样函数插值法。
我们得到的结果如下:
terrain7
添加细节 现在我们必须添加更高分辨率的细节,使地形更加有趣和真实。为此,我使用512×512的8位地图,其中高地储存在蓝色通道中,高地导数(注:一个变量随某个变量变化时的速度或变化率)存在红色和绿色通道中。
detail
以每个顶点1象素,最高的地形分辨率,取样这个细节地图,然后添加到主要高地上,使地图更加生动。
terrain8
调整细节地图上的地形渐变和接近跑道曲线的地方,使陡峭的区域更加崎岖,使山谷更加平整。这么做也使跑道更加漂亮和平整,尽管这是在编辑器中可配置的跑道曲线片段。
表面地图 着色器需要更多关于地图的信息,我把它存在“表面”地图中:
surface
R: d(高度)/dx
G: d(高度)/dy
B: 表面类型 (尘土或草地/石块)
A: 细节倍增器 (由渐变和路道邻近决定的)