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

标签 opengl runtime-error buffer memcpy

使用 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/

相关文章:

c - 如何在 OpenGL 中创建便宜的阴影?

opengl - 根据不同的 texcoord 计算 mip 级别选择

opengl - 找不到 glXCreateContextAttribsARB

syntax - 鸡计划是否支持复数?如果是这样,为什么我会收到此错误?

ios - 执行 segue 时线程 1 : signal SIGABRT,

python更改UDPServer中的最大限制接收缓冲区

c# - 写入 FileStream 时 c# 中的 OutOfMemoryException

opengl - 如何在立方体上获得平坦的法线

algorithm - 数独求解器 Scilab

python - 如何在不等待输入的情况下检查可能为空的标准输入?