尝试实现VAO时,glMapBufferRange错误“​​缓冲区必须绑定且未映射”

时间:2015-11-17 09:49:09

标签: c++ opengl vao

所以问题是我要写入缓冲区:

void* dst = glMapBufferRange(target, offset, size, GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_RANGE_BIT | GL_MAP_UNSYNCHRONIZED_BIT);

对于第一次调用确实有效,但不是第二次调用,我不确定为什么会出现这种情况。

出于可能的原因:

  • GL_INVALID_OPERATION由glMapBufferRange生成,如果零绑定到目标。
  • 如果offset或length为负,如果offset + length大于缓冲区对象的GL_BUFFER_SIZE值,或者访问的任何位设置不同于上面定义的位,则生成GL_INVALID_VALUE。
  • 长度为零。
  • 缓冲区对象已处于映射状态。
  • 既未设置GL_MAP_READ_BIT也未设置GL_MAP_WRITE_BIT。
  • 设置了GL_MAP_READ_BIT,并设置了GL_MAP_INVALIDATE_RANGE_BIT,GL_MAP_INVALIDATE_BUFFER_BIT或GL_MAP_UNSYNCHRONIZED_BIT中的任何一个。
  • 设置了GL_MAP_FLUSH_EXPLICIT_BIT且未设置GL_MAP_WRITE_BIT。
  • 设置了GL_MAP_READ_BIT,GL_MAP_WRITE_BIT,GL_MAP_PERSISTENT_BIT或GL_MAP_COHERENT_BIT中的任何一个,但缓冲区的存储标志中不包含相同的位。

...我不确定如何验证/修复的唯一一个是“缓冲区对象已经处于映射状态”。这可能与我所看到的错误有关吗?

如果是这样的话,我会读到GL_MAP_PERSISTENT_BIT,但我们的目标是4.2,而glBufferStorage需要4.4,所以我不确定在那种情况下我还能如何解决这种情况。

不幸的是,我不能在不修改大量内容的情况下发布所有涉及的代码,但我的基本设置是为每个新创建的GL_ARRAY_BUFFER创建一个VAO,并且每当缓冲区被绑定时(没有VAO的代码) ),我改为绑定VAO。

绑定的VAO是我们称之为“滚动VBO”的缓冲区,因为它被用作所有文本和其他misc的一种捕获。渲染。也许是因为它被用于许多不同的事情......但我不确定如何确定它究竟是什么。

如果有任何代码或其他信息有用,请告诉我,我不确定这个问题究竟需要什么。非常感谢您的帮助!

0 个答案:

没有答案