如何获得玩家看到的方块?


15

我正在使用Ogre引擎编写类似于Minecraft的游戏,但遇到了问题。我必须优化游戏,因为当我尝试绘制10000个图块时,我有2 FPS ...因此,我想到了显示平面图块并隐藏不可见的图块的想法。但是我有一个问题-如何知道播放器一次可以看到哪些块?

并且-如果您知道此类游戏的其他优化方法,请在Ogre中编写内容以及如何使用它们。

Answers:


16

好吧,食人魔已经实现了截锥体剔除(基本上不会画出从相机看不到的任何东西),但是我认为您的问题是另外一个问题。

您实际上不应该显示10000个块,通常是做什么的(或者至少是在少数基于Ogre3d的Minecraft中,例如我见过的克隆(我也正在制作其中的一个),而在原始版本中)正在创建网格(块的某些NxNxN区域),其中包含所示立方体的外表面。也就是说,当您并排放置2个多维数据集时,看不见这2个面,因此无需绘制。

这些面也应以如下方式绘制:http : //www.ogre3d.org/tikiwiki/tiki-index.php?page=DynamicGrowingBuffers,因为现代视频卡更喜欢一个100000多边形的网格而不是1000个100多边形的网格。


10

这个问题有两个方面。首先,您如何绘制10000块?您是否实际上将它们绘制为10000个单独的对象?如果是这样,几乎可以肯定这是您的瓶颈,而不是缺少咬合剔除。您应该将这些块分组为较少数量的网格(每个网格可能几千个),以减少绘制调用。

关于您的实际问题,脑海中浮现出三种遮挡剔除。

1)视锥面外的块。这意味着位于您或您身后两边的方块。食人魔已经通过视锥剔除删除了这些。

2)处于“地下”或完全被其他块包围的块,因此从任何角度都无法看到它们。您可以通过查看siz相邻块来识别它们。如果它们全部牢固,则您的块将被隐藏。GPU甚至永远也不会听说这些块-在构建代表表面的网格时应该跳过它们。

3)从表面上的某些块可以从水平面的某些位置看到,但当前被小山(或其他物体)隐藏。这是我尚未解决的最棘手的情况,但是很有可能在这种情况下可以使用硬件遮挡查询。

这是一个无耻的插件,但是我有一个相当成熟的库,有几个人正在使用它来开发Minecraft克隆,包括一些使用Ogre的克隆。定义体积的内容,它会生成曲面网格,然后可以对其进行渲染。这是主页:

http://www.thermite3d.org/

以下是正在使用它的其他人的项目的视频:

http://www.youtube.com/watch?v=Jju6WRPEK7o


4

您可以使用背面剔除来剔除不面向播放器的顶点及其关联像素。深度缓冲应该照顾好其余部分。1万个块确实不是很多,我的5770可以以1500fps渲染10万个顶点。我认为您在做其他严重错误的事情。


我同意。这可能是其他问题。
Notabene

1

如果您有10000个单独的对象,则瓶颈可能是基本数量,而不是顶点,多边形或填充。将对象烘焙到较少数量的较高多边形对象中以提高速度。

Minecraft有一个立方体块的概念,但目前无法找到参考。

也是我使用各种技术绘制大量立方体的实验。还不包括烘焙。


0

我要做的是在创建块数组之后,但是在创建顶点之前,我运行了一个名为UpdateBlockVisiblility的子项。

子程序仅检查该块的邻居,并相应地更新“块”表面可见的布尔值。

#define BLOCKFACE_NORTH 0

#define BLOCKFACE_SOUTH 1 

etc etc etc

if(IsBlockAt(NorthOfBlock))
  Blocks[Whatever].facevisible[BLOCKFACE_NORTH] = false;

然后,我仅在可见的情况下为该面创建顶点!简单:)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.