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

Cod*_*ler 2 opengl buffer lwjgl vertices indices

如果你想在观看平截头体中一次渲染一个包含数千个多边形的大型景观,以及用户的视点不断变化,那么使用VAO或VBO是否切实可行?

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

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

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

Fel*_* K. 6

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

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

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


dat*_*olf 5

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

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