2010-07-07 154 views
3

我有一个与缓冲区对象性能有关的问题。我已经使用标准Vertex Arrays(不交错)渲染了一个网格物体,并且我想将其更改为Buffer Object以获得一些性能提升。当我介绍缓冲区对象时,当我发现使用缓冲区对象使性能降低四倍时,我感到震惊。我认为缓冲区应该会提高性能。这是真的吗?所以,我认为我做错了什么...OpenGL:缓冲区对象性能问题

我已经渲染3D平铺地图,并减少所需内存量我只使用一个单一的瓷砖(顶点集)来呈现整个地图。我只更改每个贴图的顶点位置的纹理坐标和y值。用GL_DYNAMIC_DRAW参数创建位置和纹理坐标的缓冲区。索引的缓冲区由GL_STATIC_DRAW创建,因为它在地图渲染过程中不会更改。因此,对于映射缓冲区的每个区块至少映射一次并且不映射至少一次。我是否应该只使用一个缓冲区来创建纹理坐标和位置?

感谢,

回答

2

尝试移动你的顶点/纹理坐标与GL_MODELVIEW/GL_TEXTURE矩阵,和(单独GL_STATIC_DRAW)独自离开缓冲区中的数据。例如如果瓷砖大小为1x1,则创建矩形(0,0) - (1,1),并使用glTranslate设置其在世界中的位置。与纹理坐标相同。

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

+0

好的,谢谢。是的,我正在考虑使用纹理矩阵来移动纹理坐标。我也通过使用GL_MODELVIEW来移动顶点坐标,但是我需要改变每个顶点的一个值(y值),以将其调整到高度。顺便说一句,这是更少的四边形。 ;) – gaspode 2010-07-07 14:39:02

2

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

此外,请确保您调用glMapBuffer的访问参数设置为GL_WRITE_ONLY,假定您不需要读取缓冲区的内容。否则,如果缓冲区位于视频内存中,则必须将其从视频内存传输到主内存,然后再返回(对于每次地图调用,这都取决于驱动程序......)。通过公共汽车传输大量数据是一个非常真实的瓶颈,很容易碰到。