zhigu 发表于 2007-7-15 23:48:00

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

如有转载,&nbsp;请注明出处:<br/><font color="#9c0000">http://www.azure.com.cn/</font>
        <p></p><p><b>声明:&nbsp;这种方法对于RTT方式实现的水面最适用,其他水面(纹理动画)并没有多大意义,请读者们注意。</b></p><p>我们当前游戏的水体其实就是一个大平面,&nbsp;横插在整个地形上。<br/>也许你会笑我,这样不是摄像机裁减不掉了吗?你不知道把水面分块吗?这样不是可以被摄像机裁减掉吗?你这样说其实没有错,但它针对那种纹理动画的水面是有效果的,对于那种RTT的水面的性能提升几乎为0,为什么?让我来解释给你听。</p><p>RTT水面的主要性能消耗,主要集中在两个方面。</p><p>1.&nbsp;多渲染一遍场景(渲染到纹理过程)<br/>2.&nbsp;Pixel&nbsp;shader</p><p><br/>而1应该占性能消耗的80%以上,pixel&nbsp;Shader只是简单的纹理采样和扰动,没有多大的性能消耗。</p><p>如果你明白了这一点以后,我告诉你,如果你看到了你所谓的一块水,其实<b>多渲染一遍</b>场景的代价就已经发生了。无论你把看不到的水块都隐藏掉,也不能消灭这80%的性能消耗部分,这也是为什么我不想分块的原因了,效率根本提高不了什么,还编程起来麻烦。</p><p>那是不是没有一点优化和性能提高的空间了呢,当然不是,下面我就介绍我水体裁减体的生成,用于优化水面的渲染。</p><p>首先见下图,有这样一块水面:<br/><img src="UploadFile/2007-7/2007715234733734.gif" border="0" alt=""/></p><p>蓝色部分代表露在地形上面的水面,灰色代表地形部分。<br/>如果不做任何处理的话,当你的摄像机看不到水的时候,RTT的过程仍然在进行中,因为你无法裁减掉它,它是一个大大的平面,为了在看不见水的时候关闭RTT操作,你就需要生成<b>裁减体</b>了,下面简述下其生成过程。</p><p>先见下图:<br/><img src="UploadFile/2007-7/2007715234734580.gif" border="0" alt=""/></p><p>我们先对整个地形区域分块(不是上面提到的分块)只是是逻辑上分块,并不是分成多个对象了。上图我们平均分成了16个等大小的块,当然你可以分的更多,那样裁减就更精确,但是判断水面的可见性就代价更大了,按上图分割法是最平衡的。</p><p>下面我们为每块生成此块内的水体裁减体。我所谓水体裁减体就是一个能包围住这块水体的最大矩形,由于水面的高度是一定的,所以我们暂时忽略裁减体的高度信息。</p><p>见下图:<br/><img src="UploadFile/2007-7/2007715234735621.gif" border="0" alt=""/></p><p>生成的基本算法如下,上图有A,B,C,D四个过程:<br/><br/>[*]A过程,从上到下扫描。横向扫描,依次每隔一个小步长检测当前地形的高度,如果发现第一个某一点处,地形的高度低于水面的高度,则可以确定上边界值。<br/>[*]C&nbsp;过程也同理,从下到上扫描,以确定下边界值<br/>[*]B&nbsp;过程从左到右扫描,以确定左边界值<br/>[*]D&nbsp;过程从右到左扫描,以确定右边界值<br/></p><p>这样四个边界围成的区域就是这块水体的一个裁减体。</p><p>那么我们对所有块这样处理,就生成了整个地形水域的裁减体了。<br/>见下图:<br/><img src="UploadFile/2007-7/2007715234735360.gif" border="0" alt=""/></p><p>有了这些裁减体的信息,我们就可以进行可视判断了,只要<b>任意一个</b>矩形在你的视野内,RTT过程就要进行,水面就要显示,如果<b>没有一个</b>裁减体在你的视野内,则关闭RTT,隐藏水体,还有一个可选择的优化方式是,如果<b>所有的</b>裁减体都距离你在一个范围之外,则关闭RTT,隐藏水体。</p><p>如上图所示,蓝色的视野部分未看到任何的矩形,则应该关闭RTT,隐藏水体了。</p><p>以上就是我原创的水体裁减体的生成方式和裁减方式,<br/>如果有什么不对,欢迎大家指正。</p>

jiffwan 发表于 2007-7-30 11:22:00

<p>……这种文章还到处转,服了</p><p></p>
页: [1]
查看完整版本: 水体裁减体的生成与水体的裁减