我有一个大数据传输到缓冲区,如VBO或IndirectDrawBuffer,我使用glMapBuffer和glBufferSubData来做到这一点。我发现使用glMapBuffer上传的缓冲区比渲染缓冲区时使用glBufferSubData慢得多。 我像这样分配缓冲区
glBindBuffer(GL_DRAW_INDIRECT_BUFFER, m_indirectDrawBuffer);
glBufferStorage(GL_DRAW_INDIRECT_BUFFER, buffersize, 0, GL_DYNAMIC_STORAGE_BIT);
我像这样使用了glMapBuffer
m_indirectDrawBufferPtr = (GLubyte*)glMapNamedBuffer(m_indirectDrawBuffer, GL_WRITE_ONLY);
memcpy(m_indirectDrawBufferPtr, m_MultidrawCommands.data(), buffersize);
glUnmapNamedBuffer(m_indirectDrawBuffer);
我像这样使用了glBufferSubData
glNamedBufferSubData(m_indirectDrawBuffer, 0, buffersize, m_MultidrawCommands.data());
为什么会发生这种情况?
使用glMapBuffer,我该怎么做才能获得有效的缓冲区?分配2个缓冲区,一个使用glMapBuffer,另一个使用glCopyNamedBufferSubData从第一个缓冲区复制数据,也许是解决这些问题的方法。但它会使用更多的VRAM。这是唯一的方法吗?
答案 0 :(得分:1)
首先,您不允许映射该缓冲区,因此不清楚您的代码工作原因。当您allocate immutable storage for a buffer时,您必须指定打算如何访问它。并且你没有说你会把它映射为阅读或写作......所以你不能。
其次,映射缓冲区是一项相当重要的操作。如果你已经在内存块中有数据,那么映射缓冲区只是为了复制它然后立即取消映射它没有意义。映射允许您将数据直接生成到缓冲区中(理论上),因此用于填充m_MultidrawCommands
的任何操作都应该用于直接写入映射缓冲区。
此外,persistent mapping存在,它允许您保持永久映射的缓冲区。当然,这也要求您跟踪使用部分缓冲区的命令,这样您就不会写入可以读取的值。