提问者:小点点

顶点数组对象是上下文的一部分吗?


为了在OpenGL3.0中使用顶点数组对象,我们通过以下步骤创建顶点数组对象的名称,然后将其绑定到上下文中。

  • GLGenVertexArrays(1,&vao)=生成顶点数组的名称
  • GLBindVertexArrays(&vao)=将名称与顶点数组绑定。

不同的是,当我们创建和使用顶点缓冲区时,我们生成名称,绑定它,分配内存,然后在缓冲区中填充数据。

  • GLGENBuffers(1,&vbo)=生成顶点缓冲区的名称
  • GLBindBuffer(GL_ARRAY_BUFFER,VBO)=将名称绑定到GL_ARRAY_BUFFER
  • GLBufferData(。。。。)=分配内存并填充数据

由于我们没有在这些行中为顶点数组对象分配内存,这是否意味着顶点数组对象的内存已经作为上下文的一部分分配,并且使用glBindVertexArrays()我们引用指向顶点数组对象分配的内存的指针?


共1个答案

匿名用户

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没有内部存储阵列。