上下求索
探索DirectX9.0)
 

无缝大地形

本来在游戏中没有打算使用这个特性,前些天玩了一下WOW,觉得里面的Terrain很不错,观察了一下,似乎是使用得非均匀网格构成的地形。当然WOW里的无缝地形也做得很不错,所以也想尝试一下,因为我倒是觉得做LOD的话似乎没有动态读入划得来,当然有个前提,那就是IO花费的时间不能太长,所以场景不能太复杂。

动态读入地形其实并没有什么技术含量,完全是一个想到了就很简单的问题。原理如下:由于地形一般都很大,其实只需要画出视野内的地形就可以了,也可以把这个看成是视景体剔出的逆向思维。

我们使用一个数组来保存地形的顶点数据,初始化的时候只画出以摄像机为中心的64*64的网格,当然也可以调节,然后当视点在地形上移动的时候只需要重新构造这个保存顶点数据的数组就可以了。原理就这么多。

实现的时候要注意到以下几点,那就是纹理的问题。在我的实验中使用了一张大贴图,直接覆盖在地形上,这样的话,64*64网格的贴图坐标必须符合原有的贴图坐标,所以,在每次构造64*64网格的时候需要从原来的保存纹理坐标的数组中拷贝相应的值。

这样每次移动的时候,需要重构64*64的顶点数据,需要重构64*64*2的纹理坐标的数据。至于索引可以在程序初始化的时候算好,只需要算一次,以后可以重复使用。

其实这和以前看过的无限地形的例子是一个原理,只不过无限地形的例子中不是读入数据,而是从程序中生成的Noise来填充地形数组。

我使用的是三角条带渲染,由于考虑到频繁的IO操作,使用VBO的话会造成频繁的显存和内存的数据交换,不知道我这样的想法是不是正确,只使用了普通的顶点数组。

做到了这一步,很自然的往下考虑,如果在地形中放置有模型的话,如何正确渲染?因为地形是走一步读一步,如果在比较远的地方有个模型,就不能在一开始的时候就显示出来,必须要走近了才能显示出来。解决这个方法需要添加一个场景管理器,哪些该渲染哪些不该渲染都要由他负责。当然如果是简单点的话直接用视景体剔出也能解决。

再往下想,如果场景十分十分巨大,例如WOW的场景,这样应该就需要有很多个地形文件保存了,整个世界由无数的地形块拼成,每个地形块就是一个地形文件。我不知道WOW是怎样写的,我的想法是:

首先要有一个标记玩家正处在哪一个地形块的变量,然后需要有2个动态的缓冲,一大一小。小的缓冲就是玩家周围能看见的那些东西,大的缓冲是专门由场景管理负责写入的缓冲,这个大缓冲会从地形文件中读取数据,因为当玩家走到地图边缘的时候,此时读取的地图数据可能会从多个地图文件读取,最多的话应该是4个地图文件,这样用一个专门的IO线程来负责这个工作会更加高效。这样可以预测玩家的动向读入数据到大缓冲,然后小缓冲再从大缓冲读入数据提供给渲染。

不知道我的想法是不是对的,也不知道用2个缓冲的话是不是比一个更快。

posted on 2006-06-08 00:04  大河马和小魔鱼  阅读(1846)  评论(5)    收藏  举报