Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenGL:缓冲区对象性能问题_Opengl - Fatal编程技术网

OpenGL:缓冲区对象性能问题

OpenGL:缓冲区对象性能问题,opengl,Opengl,我有一个关于缓冲区对象性能的问题。我已经使用标准顶点数组(不是交错)渲染了一个网格,我想将其更改为Buffer Object以提高性能。当我介绍buffers对象时,当我发现使用buffers对象会四次降低性能时,我感到震惊。我认为缓冲区应该提高性能。这是真的吗?所以,我认为我做错了什么 我已经渲染了3d平铺贴图,为了减少所需的内存量,我只使用一个平铺(顶点集)来渲染整个贴图。我只更改贴图每个平铺的纹理坐标和顶点位置的y值。位置和纹理坐标的缓冲区是使用GL_DYNAMIC_DRAW参数创建的。索

我有一个关于缓冲区对象性能的问题。我已经使用标准顶点数组(不是交错)渲染了一个网格,我想将其更改为Buffer Object以提高性能。当我介绍buffers对象时,当我发现使用buffers对象会四次降低性能时,我感到震惊。我认为缓冲区应该提高性能。这是真的吗?所以,我认为我做错了什么

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


谢谢,

尝试使用
GL\u MODELVIEW
/
GL\u texture
矩阵移动顶点/纹理坐标,并且不要使用缓冲区数据(
GL\u STATIC\u DRAW
)。e、 g.如果平铺大小为1x1,则创建rect(0,0)-(1,1),并使用
glTranslate
设置其在世界上的位置。纹理坐标也是如此


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

如果您需要在每一帧更新缓冲区,您应该使用GL\u STREAM\u draw(这提示缓冲区内容可能只会使用一次),而不是GL\u DYNAMIC\u draw(这意味着它们在更新之前只会被使用几次)。 根据我的经验,使用GL_STREAM_DRAW创建的缓冲区将被类似于普通ol'数组处理,因此在使用它时,您应该期望与数组具有相同的性能


另外,如果不需要读取缓冲区的内容,请确保调用glMapBuffer时将访问参数设置为GL_WRITE_ONLY。否则,如果缓冲区位于视频内存中,则必须将其从视频内存传输到主内存,然后再返回(好吧,这实际上取决于驱动程序…)对于每个贴图调用。通过总线传输大量数据是一个非常容易遇到的瓶颈。

好的,谢谢。是的,我正在考虑使用纹理矩阵移动纹理坐标。我也使用GL_MODELVIEW移动顶点坐标,但我需要更改一个值(y值)调整每个顶点的高度以使其适应地面高度。顺便说一句,这比几个四边形还要多。;)