【问题标题】:OpenGL initial buffer binding targetOpenGL 初始缓冲区绑定目标
【发布时间】:2015-06-05 07:41:01
【问题描述】:

由于将缓冲区绑定到 GL_ARRAY_BUFFER 等目标会修改任何绑定顶点数组对象的状态,因此安全地写入缓冲区可能会很棘手。最简单的解决方案似乎是使用不影响 VAO 状态的缓冲区目标,例如 GL_COPY_WRITE_BUFFER

void write_buffer(GLint name, int size, const void* data)
{
  // error handling omitted for clarity...
  glBindBuffer(GL_COPY_WRITE_BUFFER, name);
  glBufferData(GL_COPY_WRITE_BUFFER, size, data, GL_STATIC_DRAW);
}

这具有安全调用的优点,而无需考虑当前的 OpenGL 上下文(假设您正在共享状态)和当前绑定的 VAO。

但是,根据glBindBuffer 的 OpenGL API 参考,缓冲区绑定到的初始目标可用作缓冲区内部存储方式的优化提示:

一旦创建,命名缓冲区对象可以根据需要重新绑定到任何目标。但是,GL 实现可能会根据缓冲区对象的初始绑定目标来选择如何优化缓冲区对象的存储。

这意味着如果缓冲区name 之前没有绑定到适当的最终目标,上述函数可能会阻碍优化。

我能想到的避免这种惩罚的唯一方法是在创建后立即手动将缓冲区绑定到所需的目标,然后恢复原始绑定:

GLint create_array_buffer()
{
  GLint original, name;
  glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &original);
  glGenBuffers(1, &name);
  glBindBuffer(GL_ARRAY_BUFFER, name);
  glBindBuffer(GL_ARRAY_BUFFER, original);
  return name;
}

是否有更好的方法来安全地创建和填充缓冲区(关于 VAO)?该过程应该:

  • 保留第一个绑定目标的优化提示
  • 不干扰任何绑定 VAO 的状态
  • 不像我上面那样读取状态、更改状态和恢复状态

【问题讨论】:

    标签: opengl


    【解决方案1】:

    仅绑定到GL_ARRAY_BUFFER 不会影响绑定的VAO。只有在调用glVertexAttribPointer 时才会读取绑定状态并将其放入VAO。重新绑定GL_ELEMENT_ARRAY_BUFFER 确实会影响绑定的VAO 状态。

    这意味着您可以随意更改GL_ARRAY_BUFFER 的绑定,只要确保在调用glVertexAttribPointer 之前绑定正确的缓冲区即可。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-28
      • 2019-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多