游戏开发论坛

 找回密码
 立即注册
搜索
查看: 13847|回复: 15

水体裁减体的生成与水体的裁减(原创)

[复制链接]

32

主题

1259

帖子

1351

积分

金牌会员

Rank: 6Rank: 6

积分
1351
发表于 2007-7-1 00:36:00 | 显示全部楼层 |阅读模式
如有转载, 请注明出处:
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,隐藏水体了。

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

www.azure.com.cn

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
发表于 2007-7-1 08:22:00 | 显示全部楼层

Re:水体裁减体的生成与水体的裁减(原创)

想法不错,学习了。

16

主题

114

帖子

114

积分

注册会员

Rank: 2

积分
114
发表于 2007-7-1 21:31:00 | 显示全部楼层

Re:水体裁减体的生成与水体的裁减(原创)

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

    这种判断会不会有问题?
    比如山的一边的地型是底于山的另一边的河的水平面.
    而且这样分边界的必要性表示严重的置疑.

18

主题

971

帖子

982

积分

高级会员

Rank: 4

积分
982
发表于 2007-7-2 00:04:00 | 显示全部楼层

Re:水体裁减体的生成与水体的裁减(原创)

建议楼主想法成熟后再发贴^^

89

主题

4036

帖子

4132

积分

论坛元老

Rank: 8Rank: 8

积分
4132
发表于 2007-7-2 09:01:00 | 显示全部楼层

Re:水体裁减体的生成与水体的裁减(原创)

没觉得想法不成熟就不能发帖.
不成熟才要讨论嘛.

32

主题

1259

帖子

1351

积分

金牌会员

Rank: 6Rank: 6

积分
1351
 楼主| 发表于 2007-7-2 09:01:00 | 显示全部楼层

Re: Re:水体裁减体的生成与水体的裁减(原创)

iverson: Re:水体裁减体的生成与水体的裁减(原创)

生成的基本算法如下,上图有A,B,C,D四个过程:
  • A过程,从上到下扫描。横向扫描,依次每隔一...


已经假定, 一个地图中只有一种水平面, 你说的那个地势比水低的话, 那低的地势上方必然是水面.

生成算法都是离线算出的, 不会有什么效率问题.

32

主题

1259

帖子

1351

积分

金牌会员

Rank: 6Rank: 6

积分
1351
 楼主| 发表于 2007-7-2 09:03:00 | 显示全部楼层

Re: Re:水体裁减体的生成与水体的裁减(原创)

whb9633: Re:水体裁减体的生成与水体的裁减(原创)

建议楼主想法成熟后再发贴^^


如果哪里不成熟了, 欢迎指出来,
这个方法在实际中已经使用过了,
裁减的效率还是不错的,

没有经过测试的, 我也不会随便贴出来,

7

主题

438

帖子

438

积分

中级会员

Rank: 3Rank: 3

积分
438
发表于 2007-7-2 20:47:00 | 显示全部楼层

Re:水体裁减体的生成与水体的裁减(原创)

很实际的想法。实现应该不难,但是可以很好的去除渲染看不见的水面多消耗的那一遍RTT开销。支持。

3

主题

49

帖子

49

积分

注册会员

Rank: 2

积分
49
发表于 2007-7-3 19:03:00 | 显示全部楼层

Re:水体裁减体的生成与水体的裁减(原创)

楼主的想法:
根据RTT水的特点,使用水体裁减体来优化,核心思想是看不到水的时候就不用多画一次场景。
---------------------------------------------------------
我的想法:
我觉得直接用四叉树就行了,四叉树也很简单,运算量也不大,但是精度会比水体裁减体高一些。
---------------------------------------------------------
我的其它的一些想法:
我觉得RTT水的优化不应该光把注意力集中在是否能看到水。假设你发明了一种算法,开销为0,可以100%精确的判断出当前是否可以看到水。但那对美工又有什么用呢?对于有RTT水的场景,场景的复杂度还是要受到RTT水的影响。虽然看不到RTT水的时候FPS很高,但是美工做场景的时候还是要按照能看到RTT水的时候所能允许的场景复杂度来制作场景。
我觉得应该想想怎么对"多画一次场景"那里进行优化,应该设计一个算法,使引擎在"多画一次场景"的时候仅绘制那些能被水反射到的物体。

32

主题

1259

帖子

1351

积分

金牌会员

Rank: 6Rank: 6

积分
1351
 楼主| 发表于 2007-7-3 21:07:00 | 显示全部楼层

Re: Re:水体裁减体的生成与水体的裁减(原创)

saya3d: Re:水体裁减体的生成与水体的裁减(原创)

楼主的想法:
根据RTT水的特点,使用水体裁减体来优化,核心思想是看不到水的时候就不用多画一次场景。
-...


你好, 这两方面其实都已经做了, 渲染水场景的时候,一些小而琐碎的物体, 已经关掉了.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-12 18:22

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表