为了在OpenGL3.0中使用顶点数组对象,我们通过以下步骤创建顶点数组对象的名称,然后将其绑定到上下文中。
不同的是,当我们创建和使用顶点缓冲区时,我们生成名称,绑定它,分配内存,然后在缓冲区中填充数据。
由于我们没有在这些行中为顶点数组对象分配内存,这是否意味着顶点数组对象的内存已经作为上下文的一部分分配,并且使用glBindVertexArrays()我们引用指向顶点数组对象分配的内存的指针?
glBufferData(。。。。)=分配内存并填充数据
您确实是在为缓冲区分配内存。但这与为缓冲区对象分配内存不同。
让我们用C++的术语来说。缓冲区对象类似于向量
。执行GLGenBuffers/GLBindBuffer
类似于分配Vector
对象(让我们在堆上执行):
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
有一个内部字节数组。和缓冲区对象具有内部字节数组。
除了对象本身之外,VAO没有内部存储阵列。