2011-11-29 42 views
4

我目前正在开发我的第一款3D游戏作为学校项目,游戏世界完全受到Minecraft(完全由立方体制成的世界)的启发。我目前正试图改善性能,试图实现顶点缓冲区对象,但我卡住了,我已经实现了这种方法:Fr c剔除,只绘制暴露面和距离剔除,但我有以下疑问:使用Frustum Culling需要一些帮助来实现VBOs

  1. 我目前在我的世界中有大约2^24个立方体,分为1024 * 16 * 64立方体块,现在我正在进行即时模式渲染,如果我为每个块执行一个VBO, ,每次移动摄像机(更新平截头体)时,是否必须更新该VBO?这是否有性能问题?

  2. 我可以动态更改每个VBO的大小吗?或者我必须让每一个都尽可能最大(大块完全充满物体)?

  3. 我是否必须将每个访问过的块保存在内存中,还是可以有效地移除该VBO并在需要时重新创建它。

+0

这不是说这是StackOverflow的主题,但是您可能会在gamedev.stackexchange.com上找到更多具有OpenGL经验和性能的代码。 – Kylotan

+0

你是对的,我也会在那里尝试我的运气。 – Isracg

回答

1
  1. 改变,每一次改变相机截时间VBO是不是可能是个好主意。连续缓冲数据的开销可能会超过您通过绘制更少的多边形所获得的性能收益。如果整个维也纳国际组织在完全脱离最后阶段,你可能会更好地剔除。你最终会画出更多的聚合物,而不是绝对必要的,但这将比平衡出来的事实是,从VBO绘图比直接绘制模式快得多。
  2. 您可以更改VBO的大小,但只能通过对glBufferData执行新的调用,如果您要将数据发送到图形卡,这可能是一个昂贵的通话。
  3. 你最好不要把所有的块都保存在内存中,这会很快失去控制。记住你的周围环境,当你离开时丢弃它们是你最好的选择。
+0

到2 .:如果他确实每帧都更新整个VBO,他会(或应该)调用'glBufferData',所以他也可以放入不同的大小。如果他不更新VBO(就像你在1中所建议的那样),他也不需要调整它。所以在这种情况下我没有看到'glBufferData'的问题。 –

+0

我只是在谈论改变VBO的大小,而不是专门针对他的情况。我的意图是表明改变vbo的大小需要一个完全的拒绝,因此你不能轻易地在最后添加一些元素。 – nonVirtualThunk

+0

@nonVirtualThunk我还有一个问题,是否必须为每个VBO中的每个顶点保留一个索引?似乎有点内存昂贵,因为我有许多顶点。我不能只画一个给定的VBO的所有顶点? – Isracg

1
  1. 先天真(不neccessarily在一个坏的意义上)的做法确实是更新VBO基础上,视锥和隐藏面剔除结果每一帧。虽然这可能听起来很邪恶,但请记住,使用即时模式实际上是同样的事情(每帧将每个顶点发送到GPU),但有一百万次驱动程序调用(不要低估一个glVertex),而不仅仅是几个缓冲区函数,一次平局。

    因此,使用VBOs(当然使用GL_DYNAMIC_DRAW甚至GL_STREAM_DRAW)很可能仍然会比立即模式更快。这不仅是可能的GPU存储,而且也是减少了使VBO(或通常顶点阵列)比立即模式更快的驱动程序调用数量。

    稍后,您还可以使用变换反馈实现一些更复杂的硬件剔除技术,因此您可以直接在GPU上剔除,而不需要将每个帧的顶点数据发送到GPU。

  2. 无论如何,由于您更新整个缓冲区的每一帧(因此应调用glBufferData),调整大小是绝对没有问题的。请再次拨打glBufferData,并以不同的尺寸显示。

  3. 这取决于你有多少个块。但是如果它们的数量变大了,那么一些缓存技术(删除更远的VBO,删除距离,块)可能是一个好主意。

+0

嘿,我的建议取得了很好的进展,我只有一个问题。我需要为每个VBO中的每个顶点保留一个索引吗? – Isracg