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

时间:2017-06-28 20:45:01

标签: opengl

要在OpenGL 3.0中使用顶点数组对象,我们使用以下步骤创建顶点数组对象的名称,然后将其绑定到Context。

  • glGenVertexArrays(1,& VAO)=生成顶点数组的名称
  • glBindVertexArrays(& VAO)=用顶点数组绑定名称。

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

  • glGenBuffers(1,& VBO)=生成顶点缓冲区的名称
  • glBindBuffer(GL_ARRAY_BUFFER,VBO)=将名称绑定到GL_ARRAY_BUFFER
  • glBufferData(....)=分配内存和填充数据

由于我们尚未在这些行中为顶点数组对象分配内存,是否意味着顶点数组对象的内存已作为一部分分配Context 并使用glBindVertexArrays()我们引用一个指向顶点数组对象的已分配内存的指针?

1 个答案:

答案 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没有超出对象本身的内部存储阵列。