【问题标题】:What does the GL_ARRAY_BUFFER target mean in glBindBuffer?glBindBuffer 中的 GL_ARRAY_BUFFER 目标是什么意思?
【发布时间】:2013-02-10 21:36:37
【问题描述】:

我对 VBO 感到困惑,

glGenBuffers(1, &positionBufferObject);
glBindBuffer(GL_ARRAY_BUFFER, positionBufferObject);

除了 GL_ARRAY_BUFFER,还有其他目标类型:GL_ATOMIC_COUNTER_BUFFER、GL_COPY_READ_BUFFER...

但是,Opengl 手册没有提到这些目标的含义。我检查了glew.h:

#define GL_ARRAY_BUFFER 0x8892

这是否意味着目标(如 GL_ARRAY_BUFFER)是地址?

glBindBuffer中的target--GL_ARRAY_BUFFER是什么意思?

【问题讨论】:

标签: opengl graphics opengl-es glsl shader


【解决方案1】:

一般

大多数OpenGL objects 必须绑定到OpenGL 上下文中称为“目标”的位置才能使用它们。目标只不过是绑定对象的上下文中的一个地方。

不同的对象类型(缓冲区、纹理等)具有不同的目标集。一般来说,每个目标都有特定的含义:将一个对象绑定到一个目标意味着您希望以目标使用与其绑定的对象的任何方式来使用该对象。

将一个对象绑定到一个目标不会影响该对象是否绑定到另一个目标(除非它是一个纹理对象;它们对目标的处理方式不同)。

有些函数可以修改对象或从绑定对象中查询数据。他们获取一个目标,他们正在修改/查询的对象已绑定到该目标。

GL_ARRAY_BUFFER

buffer objectsGL_ARRAY_BUFFER 目标表示 use that buffer object for vertex attribute data 的意图。然而,仅仅绑定到这个目标并没有做任何事情。只有对glVertexAttribPointer (or equivalent functions) 的调用使用绑定到该目标的任何缓冲区来获取该属性的属性数据。

【讨论】:

  • 但是如果我想使用多个缓冲区(vbo),一个用于顶点坐标,另一个用于纹理坐标,我应该将它们都绑定到 GL_ARRAY_BUFFER 吗??
  • 在给定时间每个目标一个绑定对象。如果要对第二个进行操作,则在绑定第二个时替换第一个 - 将目标视为存储值的地址。
【解决方案2】:

但是,Opengl 手册没有提到这些目标的含义。

OpenGL 2.1 spec, page 38, section 2.9.1: "Vertex Arrays In Buffer Objects"

这是否意味着目标(如 GL_ARRAY_BUFFER)是地址?

不,它们只是像 enums 一样使用 unsigned ints。

【讨论】:

  • 谢谢,非常感谢。
  • 您完全可以将这些视为地址; GL 规范本身明确鼓励这种隐喻。
猜你喜欢
  • 1970-01-01
  • 2014-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-07
  • 1970-01-01
  • 2014-01-31
相关资源
最近更新 更多