glBindBuffer中的GL_ARRAY_BUFFER目标是什么意思?

26

我对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中,目标GL_ARRAY_BUFFER是什么意思?


1
OpenGL缓冲对象维基页面涵盖了这个内容。 - Nicol Bolas
3个回答

54

概述

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

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

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

有一些函数会修改对象或从绑定的对象查询数据。它们需要一个已绑定了要修改/查询对象的目标。

GL_ARRAY_BUFFER

GL_ARRAY_BUFFER缓冲对象的一个目标,表示使用该缓冲对象存储顶点属性数据。但是,仅绑定到此目标不会产生任何效果;只有调用glVertexAttribPointer(或等效函数)才会将绑定到该目标的缓冲区用于该属性的属性数据。

1
但是,如果我想要使用多个缓冲区(VBO),一个用于顶点坐标,另一个用于纹理坐标,我应该将它们都绑定到GL_ARRAY_BUFFER吗? - barney
每个目标只能绑定一个对象。如果您想操作第二个对象,当您绑定第二个对象时,第一个对象将被替换 - 将目标视为存储值的地址。 - BadZen

4

你可以把它们看作是地址;OpenGL规范明确地鼓励使用这个隐喻。 - BadZen

0

我会尽力简短地解释。在OpenGL中,目标(也称为上下文)是一个特定的接口,它可以一次处理其类型的一个对象。每个目标都有一组影响其所有对象的参数,这些参数存储在内部,仅显示它们的ID。API从不允许用户直接访问这些对象,因为错误的指针可能比错误的ID造成更多的损害。

目标之间没有连接,因此您可以同时使用不同类型的对象。对象ID允许您在使用相同接口时在相同类型的对象之间切换。您必须将对象ID绑定到其特定目标以进行处理,然后取消绑定以处理其他对象,或者直接将另一个对象ID绑定到相同的目标,这将自动取消绑定先前的对象。这是API的基本概念。

你的代码中第一行获取了缓冲区 ID。 第二行将该 ID 绑定到 GL_ARRAY_BUFFER 目标上,这可以被描述为内部设置 顶点属性缓冲对象 或 VBO。现在使用这个 ID,你可以引用一个内部存储的 VBO。

希望这有所帮助!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接