2

如果您想一次在视锥中渲染具有数千个多边形的大型景观,并且用户的视点不断变化,那么使用 VAO 或 VBO 是否可行?

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

那么在立即模式下使用这两种方法是否仍然有益?

我的猜测是肯定的,因为使用即时模式,您还可以在每一帧重新计算所有顶点,只是方式略有不同。可悲的是,我没有太多的背景知识,而且我很困惑,因为互联网上关于这个话题的信息不一。

4

2 回答 2

6

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

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

  • 使用某种LOD。有不同的方法可以做到这一点(查看此处获取图像如何工作,但不必这样做)。通常,当场景与观察者的距离很远时,您会减少多边形。如果您有 2D 地形(无悬垂地形),则非常简单。如果您的地形更复杂,则更难处理,但仍有可能。
  • 将所有缓冲区保留在 RAM 中,这些缓冲区可能会在几分钟内可见(但不是必须),与 LOD 方法相比,这非常消耗内存。如果地形段超出视野范围,请将其删除。
  • 流式传输数据并使用双缓冲 VBO(这意味着:对于一个段,您有 2 个 VBO,一个正在渲染,一个正在写入)
于 2013-01-29T01:06:05.247 回答
5

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

不,你没有。在典型的地形渲染器中,数据被细分为瓦片。通常这些图块会再次细分,以实现详细程度。使图块与众不同的是它们引用的顶点。因此,您将拥有一个用于地形数据的大型顶点数组,以及许多用于切片的索引数组。通过使用正确的索引数组调用 glDrawElements,您可以选择在哪个细节级别绘制哪些图块。

于 2013-01-29T01:07:23.713 回答