我对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是什么意思?
3条答案
按热度按时间r55awzrz1#
一般情况
大多数OpenGL objects必须绑定到OpenGL上下文中称为“目标”的位置才能使用。目标只不过是上下文中绑定对象的位置。
不同的对象类型(缓冲区,纹理等)有不同的目标集。一般来说,每个目标都有特定的含义:将一个对象绑定到一个目标意味着您希望以该目标使用绑定到它的对象的任何方式来使用该对象。
将一个对象绑定到一个目标并不影响该对象是否绑定到另一个目标(除非它是纹理对象;它们以不同的方式对待目标)。
有一些函数可以修改对象或从绑定的对象中查询数据。它们接受一个目标,它们正在修改/查询的对象已经绑定到该目标。
GL_ARRAY_BUFFER
buffer objects的
GL_ARRAY_BUFFER
目标表示将该缓冲区对象用于顶点属性数据的意图。只有对glVertexAttribPointer
(or equivalent functions)的调用才使用绑定到该目标的缓冲区来获取该属性的属性数据。rn0zuynd2#
然而,OpenGL手册并没有提到这些目标的含义。
OpenGL 2.1 spec, page 38, section 2.9.1: "Vertex Arrays In Buffer Objects"
这是否意味着目标(如GL_ARRAY_BUFFER)是地址?
不,它们只是像
enum
一样使用的unsigned int
。bf1o4zei3#
我会尽我最大的努力来解释简短。在OpenGL中的目标(也叫context)是一个特定的接口,一次只能处理一个同类型的对象,每个目标都有一组影响其所有对象的参数,这些参数存储在内部,只显示它们的id,API不允许用户直接访问这些对象。因为错误的指针可能导致比错误的ID大得多的损害。
目标不相连,可以同时使用 * 不同 * 类型的对象,对象id允许在使用同一个接口的情况下,在 * 相同 * 类型的对象之间进行切换,需要先将对象id绑定到特定的目标上再处理,然后解绑才能处理其他对象,或者直接将另一个对象id绑定到同一个目标上,自动解除绑定前一个对象。这是API的基本概念。
代码中的第一行获取缓冲区id。第二行将id绑定到
GL_ARRAY_BUFFER
目标,这可能被描述为内部设置 * Vertex attributes buffer object * 或VBO。现在使用此id可以引用内部存储的VBO。希望有帮助!