当我尝试使用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_DRAW
或GL_DYNAMIC_DRAW
分配数据,我会收到效果警告。如果我使用GL_STATIC_DRAW
,我不会收到任何警告。但是,这个顶点缓冲区意味着每帧都要更新。如果我使用glBufferSubData
,无论存储提示如何,我都不会收到任何警告。