上下求索
探索DirectX9.0)

前天洗澡的时候突然想到一个想法
似乎我总是在洗澡的时候才有灵感

我给部队做到虚拟战场的项目
由于涉及到一个室外场景的漫游
所以技术的主要难点就在terrain上面了

由于要求显示弹坑,
并且最小直径为1米,
所以最开始的解决方案我想都没想
做了一块3000*3000个网格的地形
用八叉树+基于patch 剔除的Geomipmap LOD,
后来发现其实这样的话效果其实并不好,速度勉强够
后来决定用动态读入的方法
每次只读入视点周围的256*256个网格,
视点在一个方向上移动超过一定距离就再读
这样的效果不错,
速度很快,本来打算如果速度不快 再针对这一小块做lod
看来不需要了,
但是还有一个问题,就是每次只显示有视点周围256*256的地形
那么就有很大一部分是空的
最开始直接想用个体积雾挡住的
后来也是偶然想到一个简单的解决方法,
在这块地形下面再画一块只有4个顶点的3000*3000的地形
因为部队只是需要一块平的地面,所以正好可以用这一块假的terrain
这样2块地形配合起来正好看不出来。

昨天我想到
其实我一直在做傻事
本来弹坑就不是很多
完全没有必要做一块那么大的地形
做这么大一块地形虽然速度上没有问题,但是每次读入的数据还是很大
更好的方法是
每个弹坑动态的生成一个Mesh,这个mesh按照弹坑直径的要求生成
也就是说最大也不过10*10
然后将这个mesh 加入到场景中,
画的时候把深度测试关掉就一切Ok,
这样还有一个好处,弹坑的纹理可以单独指定,
以前的做法都是用glSubTexture2d (似乎是这么写,不记得了)动态的在整个terrain的纹理上修改
由于整块地形是3000*3000 不是2的n次幂
为了简化工作我直接作了一张特大纹理
纹理是一张2048*2048的一张图
拉升也很严重,有人会说opengl2.0支持非2的n次幂纹理
确实,但是glSubTexture2d 那个函数不支持
2048拉升到3000,加上很多弹坑本来就只有1米,2米
对应到纹理的像素 其实只有1-2个像素
现在好了,把弹坑单独提出来做
什么问题都解决了

其实也想起来
刚开始做这个项目的时候
在论坛上看到有人说过类似的方法
无奈当时不当回事
转了个大圈子 还是回到了原地

posted on 2006-11-03 17:43  大河马和小魔鱼  阅读(1190)  评论(3编辑  收藏  举报