OpenGL:为什么glMapNamedBuffer()返回GL_INVALID_OPERATION?

yx2lnoni  于 2022-11-04  发布在  其他
关注(0)|答案(1)|浏览(125)

使用OpenGL 4.6,我有以下(缩写)代码,在其中我创建了一个缓冲区,然后尝试Map它,以便使用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表明,只有当给定的缓冲区句柄不是现有缓冲区对象的名称时,才会生成此错误,但我确信我创建了它。还有什么我遗漏了的或做错了的吗?

p8ekf7hl

p8ekf7hl1#

当你创建不可变的缓冲存储器时,你必须告诉OpenGL你打算如何从CPU访问该存储器。这些都是要求,是您与OpenGL之间的契约,GL * 会 * 要求您遵守。
你给访问掩码传递了0。这意味着你告诉OpenGL(以及其他事情)你 * 不 * 打算通过Map来访问它。然后你就试着这么做了。
所以它没让你。
如果您想要Map一个不可变缓冲区,您 * 必须 * 在存储分配时告诉OpenGL您要这样做。特别是,如果您想要Map它以进行写入,您 * 必须 * 在gl(Named)BufferStorage调用中使用GL_MAP_WRITE_BIT标志。

相关问题