需要一些帮助用Frustum Culling实现VBO

时间:2011-11-29 18:36:49

标签: java opengl vbo lwjgl frustum

我目前正在为学校项目开发我的第一款3D游戏,游戏世界完全受到我的世界(完全由立方体制成的世界)的启发。我目前正在寻求提高实现顶点缓冲区对象的性能,但我已经陷入困境,我已经实现了这些方法:挫败剔除,只绘制暴露面和距离剔除但我有以下疑问:< / p>

  1. 我目前在我的世界中有大约2 ^ 24个立方体,分为1024个16 * 16 * 64立方体块,现在我正在进行立即模式渲染,这对于截锥体剔除效果很好,如果我每个块实现一个VBO,每次移动相机时我是否必须更新VBO(更新截头锥体)?这会有性能影响吗?

  2. 我可以动态更改每个VBO的大小吗?或者我是否必须使每一个都成为可能的最大尺寸(完全充满物体的块)?。

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

2 个答案:

答案 0 :(得分:1)

  1. 每次更换相机截头音时改变VBO都不太可能。连续缓冲数据的开销可能会超过绘制较少多边形所带来的性能提升。当他们完全移出截头体时,你可能会更好地剔除整个VBO。你最终会得到比绝对必要的更多的多边形,但是这将比通过VBO绘制比立即模式绘制快得多的事实更加平衡。
  2. 您可以更改VBO的大小,但只能通过对glBufferData进行新的调用,如果您将数据发送到图形卡,这可能是一项昂贵的调用。
  3. 你最好不要保留你在内存中创建VBO的所有块,这很快就会失控。将你周围的环境留在记忆中,并在离开时丢弃它们是最好的选择。

答案 1 :(得分:1)

  1. 第一个天真(不一定是坏意义)的方法确实是基于截头锥体和隐藏面部剔除结果来更新每帧的VBO。虽然这可能听起来很邪恶,但请记住,使用立即模式实际上是相同的(每帧将每个顶点发送到GPU)但是有一百万个驱动程序调用(不要低估glVertex)而不是仅仅几个缓冲函数和一个绘制调用。

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

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

  2. 因为无论如何都要更新每个帧的整个缓冲区(因此应该调用glBufferData),调整大小绝对没问题。只需使用其他尺寸再次致电glBufferData

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