水体裁减体的生成与水体的裁减 

2007-07-01 23:43 发布

引擎学习交流 /[PC游戏编程]
2469 0 0
如有转载, 请注明出处:
http://www.azure.com.cn/

声明: 这种方法对于RTT方式实现的水面最适用,其他水面(纹理动画)并没有多大意义,请读者们注意。

我们当前游戏的水体其实就是一个大平面, 横插在整个地形上。
也许你会笑我,这样不是摄像机裁减不掉了吗?你不知道把水面分块吗?这样不是可以被摄像机裁减掉吗?你这样说其实没有错,但它针对那种纹理动画的水面是有效果的,对于那种RTT的水面的性能提升几乎为0,为什么?让我来解释给你听。

RTT水面的主要性能消耗,主要集中在两个方面。

1. 多渲染一遍场景(渲染到纹理过程)
2. Pixel shader


而1应该占性能消耗的80%以上,pixel Shader只是简单的纹理采样和扰动,没有多大的性能消耗。

如果你明白了这一点以后,我告诉你,如果你看到了你所谓的一块水,其实多渲染一遍场景的代价就已经发生了。无论你把看不到的水块都隐藏掉,也不能消灭这80%的性能消耗部分,这也是为什么我不想分块的原因了,效率根本提高不了什么,还编程起来麻烦。

那是不是没有一点优化和性能提高的空间了呢,当然不是,下面我就介绍我水体裁减体的生成,用于优化水面的渲染。

首先见下图,有这样一块水面:

蓝色部分代表露在地形上面的水面,灰色代表地形部分。
如果不做任何处理的话,当你的摄像机看不到水的时候,RTT的过程仍然在进行中,因为你无法裁减掉它,它是一个大大的平面,为了在看不见水的时候关闭RTT操作,你就需要生成裁减体了,下面简述下其生成过程。

先见下图:

我们先对整个地形区域分块(不是上面提到的分块)只是是逻辑上分块,并不是分成多个对象了。上图我们平均分成了16个等大小的块,当然你可以分的更多,那样裁减就更精确,但是判断水面的可见性就代价更大了,按上图分割法是最平衡的。

下面我们为每块生成此块内的水体裁减体。我所谓水体裁减体就是一个能包围住这块水体的最大矩形,由于水面的高度是一定的,所以我们暂时忽略裁减体的高度信息。

见下图:

生成的基本算法如下,上图有A,B,C,D四个过程:


  • A过程,从上到下扫描。横向扫描,依次每隔一个小步长检测当前地形的高度,如果发现第一个某一点处,地形的高度低于水面的高度,则可以确定上边界值。
  • C 过程也同理,从下到上扫描,以确定下边界值
  • B 过程从左到右扫描,以确定左边界值
  • D 过程从右到左扫描,以确定右边界值

这样四个边界围成的区域就是这块水体的一个裁减体。

那么我们对所有块这样处理,就生成了整个地形水域的裁减体了。
见下图:

有了这些裁减体的信息,我们就可以进行可视判断了,只要任意一个矩形在你的视野内,RTT过程就要进行,水面就要显示,如果没有一个裁减体在你的视野内,则关闭RTT,隐藏水体,还有一个可选择的优化方式是,如果所有的裁减体都距离你在一个范围之外,则关闭RTT,隐藏水体。

如上图所示,蓝色的视野部分未看到任何的矩形,则应该关闭RTT,隐藏水体了。

以上就是我原创的水体裁减体的生成方式和裁减方式,
如果有什么不对,欢迎大家指正。

B Color Smilies

你可能喜欢

水体裁减体的生成与水体的裁减 
联系
我们
快速回复 返回顶部 返回列表