0

所以麻烦的是我要写入缓冲区:

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 的值,或者如果 access 设置了除上述定义之外的任何位,则生成 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”的缓冲区,因为它被用作我们所有文本和其他杂项的一种捕获所有内容。渲染。也许是因为它被用于很多不同的东西......但我不确定如何确定它到底是什么。

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

4

0 回答 0