OpenGL:VAO和VBO是否适用于大型多边形渲染任务?

时间:2013-01-29 00:52:51

标签: opengl buffer lwjgl indices vertices

如果您希望一次在视锥体中渲染数千个多边形的大型景观以及用户视点不断变化,使用VAO或VBO是否切实可行?

我的意思是,每次玩家的位置或相机旋转发生变化时,您都必须重新计算顶点数据,以便正确剔除任何不再看到的顶点或场景,以保持良好的FPS计数。但是在这样做时,你的FPS计数会下降,因为你正在不断重新打包所有的缓冲区。

在立即模式下使用这两种方法仍然有用吗?

我的猜测是肯定的,因为使用立即模式,你也可以每帧重新计算所有顶点,只是略有不同。可悲的是,我没有太多的背景知识,我很困惑,因为互联网上有关于这个主题的混合信息。

2 个答案:

答案 0 :(得分:6)

答案是,VBO适用于大型多边形渲染任务。不应使用立即模式,因为它是固定功能管道的一部分,并且不推荐使用FFP。

但是你应该重新计算每一帧的格局并再次将它存储在缓冲区中。有一些方法可以处理这种情况,但是你应该避免每帧都更新VBO,因为这可能会导致资源冲突。

  • 使用某种LOD。有不同的方法可以做到这一点(Look here来获取图像如何工作,但不必如此)。通常,当场景与查看器的距离较远时,您会减少多边形。如果你有一个2D地形(没有悬垂的地形),它非常简单。如果你的地形更复杂,那么处理这个问题就更难了,但仍有可能。
  • 将所有缓冲区保留在RAM中,这些缓冲区可能会在短时间内显示(但不必),与LOD方法相比,这是非常耗费内存的。如果地形段超出视野范围,请将其删除。
  • 使用双缓冲VBO流式传输数据(这意味着:对于一个段,您有2个正在渲染的VBO和一个写入的VBO)

答案 1 :(得分:5)

  

我的意思是,每当玩家的位置或相机旋转发生变化时,您都必须重新计算顶点数据

不,不。在典型的地形渲染器中,数据被细分为切片。通常这些瓷砖再次细分,并再次实现细节水平。瓦片分开的是它们引用的顶点。所以你有一个大的顶点数组用于地形数据,还有很多用于平铺的索引数组。通过使用正确的索引数组调用glDrawElements,您可以选择要在哪个级别的详细信息中绘制哪些图块。