人气 135

[游戏程序] 水体裁减体的生成与水体的裁减 [复制链接]

九艺网 2017-3-10 17:01:00

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
如有转载, 请注明出处:
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,隐藏水体了。
以上就是我原创的水体裁减体的生成方式和裁减方式,
如果有什么不对,欢迎大家指正。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

QQ|手机版|小黑屋|九艺游戏动画论坛 ( 津ICP备2022000452号-1 )

GMT+8, 2024-4-19 18:43 , Processed in 0.067863 second(s), 23 queries .

Powered by Discuz! X3.4  © 2001-2017 Discuz Team.