使用 OpenGL 4.6,我有以下(缩写)代码,在其中创建一个缓冲区,然后尝试映射它,以便使用 memcpy()
复制数据:
glCreateBuffers(buffers.size(), buffers.data()); // buffers is a std::array of GLuints
// ...
glNamedBufferStorage(buffers[3], n * sizeof(glm::vec4), nullptr, 0); // I also tried GL_DYNAMIC_STORAGE_BIT
// ...
void* bfrptr = glMapNamedBuffer(buffers[3], GL_WRITE_ONLY);
后一个调用返回 GL_INVALID_OPERATION。我确信这是生成错误的调用,因为我也在它之前捕获了 OpenGL 错误。 manpage表明仅当给定的缓冲区句柄不是现有缓冲区对象的名称时才会生成此错误,但我确信我创建了它。还有什么我遗漏的或者我做错的吗?
最佳答案
当您创建immutable buffer storage时,您必须告诉OpenGL您打算如何从CPU访问该存储。这些不是“使用提示”;而是“使用提示”。这些是要求,是您与 OpenGL 之间的契约(Contract),GL 将要求您遵守。
您为访问掩码传递了 0。这意味着您告诉 OpenGL(除其他外)您不会通过映射来访问它。然后你尝试这样做。
所以它不允许你。
如果你想映射一个不可变的缓冲区,你必须在存储分配时告诉OpenGL你要这样做。具体来说,如果您想映射它以进行写入,则必须在 gl(Named)BufferStorage
调用中使用 GL_MAP_WRITE_BIT
标志。
关于OpenGL:为什么 glMapNamedBuffer() 返回 GL_INVALID_OPERATION?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72822127/