使用glMapBufferRange

时间:2016-03-26 19:27:26

标签: c++ opengl

当我尝试使用glMapBufferRange更新数组缓冲区时,数据会更新,但是一旦缓冲区的下一次绘制发生,就会生成性能警告(通过glDebugMessageCallback),如下所示:

  

“缓冲区性能警告:缓冲区对象3(绑定到   GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB(0),   GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB(1),   GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB(2),   GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB(3),和   GL_ARRAY_BUFFER_ARB,使用提示是GL_STREAM_DRAW)   从VIDEO内存复制/移动到HOST内存。“

我按如下方式创建数组缓冲区:

glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, dataSizeBytes, vertData,GL_STREAM_DRAW);

然后我用替换顶点数据更新:

//NO PERFORMANCE WARNING IF I USE glBufferSubData
//glBufferSubData(GL_ARRAY_BUFFER, 0, dataSizeBytes, vertData);

float* dataBlock = reinterpret_cast<float*>(
    glMapBufferRange(GL_ARRAY_BUFFER, 0,
    dataSizeBytes,
    GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT | GL_MAP_UNSYNCHRONIZED_BIT));

memcpy(dataBlock, vertData, dataSizeBytes);
glUnmapBuffer(GL_ARRAY_BUFFER);

只要为此缓冲区调用glDrawElements,就会生成性能警告。我尝试删除未同步的标志和无效标志,但那些似乎没有什么区别。

我认为我做错了什么,但我不确定它是什么。代码仍然有效并且正确地绘制了所有内容(但我看到了令我烦恼的性能警告)。由于评论glBufferSubData没有生成任何警告,但glMapBufferRange会触发错误(抽奖后)。

如果我尝试更新ELEMENT_ARRAY_BUFFER,我会收到类似的效果警告。

更新1: 如果我使用GL_STREAM_DRAWGL_DYNAMIC_DRAW分配数据,我会收到效果警告。如果我使用GL_STATIC_DRAW,我不会收到任何警告。但是,这个顶点缓冲区意味着每帧都要更新。如果我使用glBufferSubData,无论存储提示如何,我都不会收到任何警告。

0 个答案:

没有答案