要在OpenGL 3.0中使用顶点数组对象,我们使用以下步骤创建顶点数组对象的名称,然后将其绑定到Context。
与我们创建和使用顶点缓冲区时不同,我们生成名称,绑定它,分配内存,然后在缓冲区中填充数据。
由于我们尚未在这些行中为顶点数组对象分配内存,是否意味着顶点数组对象的内存已作为一部分分配Context 并使用glBindVertexArrays()我们引用一个指向顶点数组对象的已分配内存的指针?
答案 0 :(得分:3)
glBufferData(....)=分配内存和填充数据
您确实在为缓冲区分配内存。但是,为缓冲区对象分配内存不同。
让我们用C ++术语来表达。缓冲区对象类似于vector<char>
。做glGenBuffers/glBindBuffer
就好像分配一个vector<char>
对象(让我们在堆上做):
auto buffer = new vector<char>;
buffer
指向真实的实时对象。 sizeof(*buffer)
将返回一些内存字节,即buffer
指向的对象需要多少内存。您可以请求buffer->size()
,它将返回合法且明确定义的值。
glGetBufferParameteri64v(target, GL_BUFFER_SIZE)
相当于调用buffer->size()
。在调用glBufferData
之前,您可以在创建对象后调用此函数。
在这两种情况下,buffer->size()
和GL_BUFFER_SIZE
,返回的大小将为0.因为您尚未在对象中放置任何内容。在这两种情况下,对象现在都存在,但它为空。
glBufferData
就像调用buffer->resize
一样。您现在告诉您分配给本身的对象分配一定大小的存储空间,并(可选)用某些数据填充它。
顶点数组对象仅与其目的不同。缓冲区对象的目的是包含存储。顶点数组对象的目的是定义存储(存储在缓冲区中)和提供渲染操作的顶点数组之间的关联。
我们的C ++类比中的VAO更像是常规结构:
struct VAO
{
int elementBuffer;
VertexFormat vf[16];
VertexBufferBinding vb[16];
};
此VAO
结构不需要超出sizeof(VAO)
的分配存储空间。就像许多C ++对象一样,除了自己之外不需要分配存储空间。因此,它没有等同于glBufferData
。
因此,为了回答您的问题,所有 OpenGL对象的内存归创建它们的OpenGL上下文所有。只是某些 OpenGL对象可以拥有超出其基本对象的额外存储空间。 vector<char>
有一个内部字节数组。缓冲区对象有一个内部的字节数组。
VAO没有超出对象本身的内部存储阵列。