当实现分割地形的时候,最好的情况下是能够给每一个分块单独的地表贴图,而不是多个纹理即时混合.事实上,在非编辑状态下,多纹理混合都有性能和硬件支持的问题.比方说某个分区用到了9张纹理,草地,雪地,岩石,泥浆等等. 如果在一个最大支持8纹理的硬件上,要想全部渲染,必须得来2次了, 当然,你可以经验性地控制住每个分区的纹理数目,但是同时也降低了地形的表现能力. 因此,我们往往会将多个纹理混合到一张纹理中,在渲染中只渲染这种混合好的纹理.
目前能找到的关于地形纹理构建的文章都是基于高度来决定最终纹理的数据,但是这种方式有天然的缺陷,对于大多数的地形而言,高度差并不大,还不足够形成令人信服的垂直气候. 而且,对于一条自然道路,更是和地形高度毫无关联了.因此,我们需要一种更灵活的构建方式.
在本人实现中,采取一种通用的Alpha Map 方式.
newColor = oldColor*(1-mask) + srcColor*mask;
逐层地将新的层按照alpha 混合到旧层中. 以下是岩石,草地,沙子按alpha混合的最终效果图:
具体实现见代码:
下载代码和可执行程序
需要注意的是,这种方式涉及到对位图的缩放采样. 在上面的代码实现中,我使用最简单的效果也最差的point 采样方式,这种方式有时也被叫做nearest~~ 也就是说,质量是最差的. 当然,你也可以采取线性,双线,三线,各向异性等方式. google it.