如有转载, 请注明出处: http://www.azure.com.cn/ 声明: 这种方法对于RTT方式实现的水面最适用,其他水面(纹理动画)并没有多大意义,请读者们注意。 我们当前游戏的水体其实就是一个大平面, 横插在整个地形上。 RTT水面的主要性能消耗,主要集中在两个方面。 1. 多渲染一遍场景(渲染到纹理过程)
如果你明白了这一点以后,我告诉你,如果你看到了你所谓的一块水,其实多渲染一遍场景的代价就已经发生了。无论你把看不到的水块都隐藏掉,也不能消灭这80%的性能消耗部分,这也是为什么我不想分块的原因了,效率根本提高不了什么,还编程起来麻烦。 那是不是没有一点优化和性能提高的空间了呢,当然不是,下面我就介绍我水体裁减体的生成,用于优化水面的渲染。 首先见下图,有这样一块水面: 蓝色部分代表露在地形上面的水面,灰色代表地形部分。 先见下图: 我们先对整个地形区域分块(不是上面提到的分块)只是是逻辑上分块,并不是分成多个对象了。上图我们平均分成了16个等大小的块,当然你可以分的更多,那样裁减就更精确,但是判断水面的可见性就代价更大了,按上图分割法是最平衡的。 下面我们为每块生成此块内的水体裁减体。我所谓水体裁减体就是一个能包围住这块水体的最大矩形,由于水面的高度是一定的,所以我们暂时忽略裁减体的高度信息。 见下图: 生成的基本算法如下,上图有A,B,C,D四个过程:
这样四个边界围成的区域就是这块水体的一个裁减体。 那么我们对所有块这样处理,就生成了整个地形水域的裁减体了。 有了这些裁减体的信息,我们就可以进行可视判断了,只要任意一个矩形在你的视野内,RTT过程就要进行,水面就要显示,如果没有一个裁减体在你的视野内,则关闭RTT,隐藏水体,还有一个可选择的优化方式是,如果所有的裁减体都距离你在一个范围之外,则关闭RTT,隐藏水体。 如上图所示,蓝色的视野部分未看到任何的矩形,则应该关闭RTT,隐藏水体了。 以上就是我原创的水体裁减体的生成方式和裁减方式, |
-
2007-07-14
-
2007-07-11
-
2007-06-23
……这种文章还到处转,服了