OpenGL:缓冲对象性能问题

3
我有一个关于缓冲对象性能的问题。我使用标准的顶点数组(非交错)渲染了一个网格,并希望将其改为缓冲对象以获得一些性能提升。但是当我使用缓冲对象时,我惊讶地发现使用缓冲对象会降低性能四倍。我认为缓冲应该增加性能。这是真的吗?所以,我认为我做错了什么...
我渲染了一个3D平铺地图,并为了减少所需内存量,我只使用单个平铺(顶点集)来渲染整个地图。我仅更改每个地图块的纹理坐标和y值的顶点位置。位置和纹理坐标的缓冲区使用GL_DYNAMIC_DRAW参数创建。索引的缓冲区使用GL_STATIC_DRAW创建,因为它在地图渲染期间不会改变。因此,对于地图的每个瓦片,缓冲区至少映射和取消映射一次。我应该仅使用一个缓冲区用于纹理坐标和位置吗?
谢谢,
2个回答

2
尝试使用GL_MODELVIEW/GL_TEXTURE矩阵移动顶点/纹理坐标,保持缓冲区数据不变(GL_STATIC_DRAW不变)。例如,如果瓦片大小为1x1,则创建矩形(0, 0)-(1, 1),并使用glTranslate将其位置设置在世界中。纹理坐标也是如此。
VBO并不是为了提高绘制少量四边形的性能而存在的。它们的真正威力体现在使用着色器绘制成千上万个多边形的网格时。如果您不需要与新的OpenGL版本保持向前兼容性,我认为使用它们来绘制动态更改的数据几乎没有用处。

好的,谢谢。是的,我在考虑通过使用纹理矩阵来移动纹理坐标。我还使用 GL_MODELVIEW 来移动顶点坐标,但我需要改变每个顶点的一个值(y 值)以调整其到陆地高度。顺便说一句,这不仅仅涉及几个四边形。;) - gaspode

2
如果您需要每帧更新缓冲区,应使用GL_STREAM_DRAW(表明缓冲区内容可能仅使用一次)而不是GL_DYNAMIC_DRAW(表明它们将在更新之前使用几次)。
就我所知,使用GL_STREAM_DRAW创建的缓冲区将类似于普通数组,因此在使用时应该期望与数组大致相同的性能。
另外,请确保在调用glMapBuffer时将访问参数设置为GL_WRITE_ONLY(假设您不需要读取缓冲区的内容)。否则,如果缓冲区位于视频存储器中,则必须将其从视频存储器转移到主存储器,然后再转移回来。将过多的数据传输到总线上是一个非常真实的瓶颈问题,很容易遇到。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接