首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenGL初始缓冲区绑定目标

OpenGL初始缓冲区绑定目标
EN

Stack Overflow用户
提问于 2015-06-05 07:41:01
回答 1查看 260关注 0票数 1

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

代码语言:javascript
复制
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。

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

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

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

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

代码语言:javascript
复制
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;
}

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

  • 保留第一个绑定目标的优化提示
  • 不要打乱任何束缚的状态
  • 不读取状态,更改状态和恢复状态,就像我上面所做的那样。
EN

回答 1

Stack Overflow用户

发布于 2015-06-05 09:41:39

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30661022

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档