我有一个与Buffer对象性能相关的问题。我已经使用标准顶点数组(非交错)渲染了一个网格,我想将其更改为Buffer Object以获得一些性能提升。当我引入buffers对象时,当我发现使用Buffers对象会降低四倍的性能时,我震惊了。我认为buffers应该可以提高性能。这是真的吗?所以,我想我做错了什么。
我已经渲染了3d平铺地图,为了减少所需的内存量,我只使用一个平铺(顶点集)来渲染整个地图。我只改变纹理坐标和y值在顶点位置为每个贴图的瓦片。位置和纹理坐标的缓冲区是使用GL_DYNAMIC_DRAW参数创建的。索引的缓冲区是用GL_STATIC_DRAW创建的,因为它在地图渲染期间不会改变。因此,对于每个贴图块,缓冲区至少映射和取消映射一次。对于纹理坐标和位置,我应该只使用一个缓冲区吗?
谢谢,
发布于 2010-07-07 21:58:57
尝试使用GL_MODELVIEW
/GL_TEXTURE
矩阵移动顶点/纹理坐标,而不使用缓冲区数据(仅使用GL_STATIC_DRAW
)。例如,如果瓷砖的大小是1x1,创建rect (0,0)-(1,1),并用glTranslate
设置它在世界上的位置。纹理坐标也是如此。
VBO的存在并不是为了提高绘制少量四边形的性能。当使用着色器绘制具有数千个多边形的网格时,可以看到它们的真正力量。如果您不需要与较新的opengl版本保持任何向前兼容性,我认为使用它们来绘制动态变化的数据没有什么用处。
发布于 2010-07-08 05:35:30
如果您需要更新每个帧的缓冲区,则应该使用GL_STREAM_DRAW (这表明缓冲区内容可能只使用一次)而不是GL_DYNAMIC_DRAW (这表明它们将在更新之前使用几次)。就我的经验而言,使用GL_STREAM_DRAW创建的缓冲区将被类似于普通的ol数组,因此在使用它时,您应该期望与数组具有相同的性能。
另外,假设您不需要读取缓冲区的内容,请确保在调用glMapBuffer时将访问参数设置为GL_WRITE_ONLY。否则,如果缓冲区在显存中,它将不得不从显存传输到主存,然后再传输回来(好吧,这实际上取决于驱动程序...)对于每个地图调用。通过总线传输大量数据是一个非常现实的瓶颈,很容易遇到。
https://stackoverflow.com/questions/3192847
复制相似问题