OpenGL:缓冲区对象性能问题

时间:2010-07-07 07:55:38

标签: opengl

我有一个与Buffer对象性能相关的问题。我使用标准的顶点数组(不是交错的)渲染了一个网格,我想将它改为缓冲对象以获得一些性能提升。当我介绍缓冲区对象时,当我发现使用Buffers对象降低性能四次时,我感到震惊。我认为缓冲区应该提高性能。这是真的吗?所以,我认为我做错了......

我有渲染3d平铺地图并减少所需内存量我只使用一个平铺(顶点集)来渲染整个地图。我只为地图的每个图块更改了顶点位置的纹理坐标和y值。使用GL_DYNAMIC_DRAW参数创建位置和纹理坐标的缓冲区。索引的缓冲区是使用GL_STATIC_DRAW创建的,因为它在地图渲染期间不会更改。因此,对于每个图块的地图缓冲区至少被映射和取消映射一次。我应该只使用一个缓冲区用于纹理坐标和位置吗?

谢谢,

2 个答案:

答案 0 :(得分:2)

尝试使用GL_MODELVIEW / GL_TEXTURE矩阵移动顶点/纹理坐标,并单独保留缓冲区数据(仅GL_STATIC_DRAW)。例如如果tile的大小为1x1,则创建rect(0,0) - (1,1)并使用glTranslate在世界中设置它的位置。与纹理坐标相同。

VBO不是为了提高绘制几个四边形的性能。使用着色器绘制具有数千个多边形的网格时,可以看到它们的真正力量。如果你不需要与更新的opengl版本的任何向前兼容性,我认为使用它们来绘制动态变化的数据几乎没用。

答案 1 :(得分:2)

如果你需要每帧更新缓冲区,你应该使用GL_STREAM_DRAW(这暗示缓冲区内容可能只会使用一次)而不是GL_DYNAMIC_DRAW(暗示它们将会被使用但之前使用过几次)正在更新)。 根据我的经验,使用GL_STREAM_DRAW创建的缓冲区将被视为与普通ol'数组类似,因此您应该期望与使用它时的数组具有相同的性能。

还要确保调用glMapBuffer并将访问参数设置为GL_WRITE_ONLY,假设您不需要读取缓冲区的内容。否则,如果缓冲区在视频存储器中,则必须将其从视频存储器传输到主存储器,然后再次返回(好吧,这完全取决于驱动程序......)用于每个地图调用。通过总线传输大量数据是一个非常真实的瓶颈,很容易碰到。