什么是顶点数组对象?(What are Vertex Array Objects?)

2019-06-26 18:29发布

我刚开始学习的OpenGL今天从本教程: http://openglbook.com/the-book/
我得到了第2章,在那里我画一个三角形,我明白,只是VAOs一切(这是缩写OK?)。 本教程使用了这样的代码:

glGenVertexArrays(1, &VaoId);
glBindVertexArray(VaoId);

虽然我明白的代码是必要的,我不知道它做什么。 虽然我从来没有使用VaoId过去的这一点(除了摧毁它),代码不没有它。 我假定这是因为它是需要绑定,但是我不知道为什么。 这是否确切的代码只是需要每一个OpenGL的计划的一部分? 本教程介绍VAOs为:

顶点数组对象(或VAO)是描述该顶点属性如何存储在顶点缓冲区对象(或VBO)的对象。 这意味着,VAO不是实际的对象存储的顶点数据,但是该顶点数据的描述符。 顶点属性可以通过glVertexAttribPointer功能和它的两个姐妹功能glVertexAttribIPointer和glVertexAttribLPointer,其中第一个我们将在下面探讨描述。

我不明白的VAO如何描述顶点属性。 我没有以任何方式描述他们。 是否得到从glVertexAttribPointer的信息? 我想这一定是它。 是VAO从glVertexAttribPointer的信息只是一个目的地是哪里?

在一个侧面说明,是我下面可以接受的教程? 有什么我应该注意或更好的教学课程的内容?

Answer 1:

“顶点数组对象”是通过了OpenGL ARB小组委员会傻名字带给你。

把它看成是一个几何对象。 (作为一个旧时代的SGI表演程序员,我打电话给他们geosets)的实例变量/对象的成员都是你的顶点指针,指针正常,颜色指针,ATTRIB n指针,...

当VAO第一次绑定,可以通过调用分配这些成员

glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer...;
glEnableClientState(GL_NORMAL_ARRAY); glNormalPointer...;

等等。 哪些属性启用,您提供的指针被存储在VAO。

之后,当你再绑定VAO,所有这些属性和指针也成为当前。 所以一个glBindVertexArray调用等效于以前需要设置的所有属性的所有代码。 它的方便传递几何周围的函数或方法之间,而无需创建自己的结构或对象。

(一次性设置,多次使用是使用VAOs最简单的方法,但你也可以只通过结合,并做更多的启用/指针调用更改属性。VAOs不是常量)。

响应帕特里克的问题更多信息:

新创建的VAO默认的是,它是空的(据我所知)。 无几何可言,甚至没有顶点,所以如果你尝试绘制它,你会得到一个OpenGL错误。 这是相当明智的,如“初始化一切为False / NULL /零”。

你只需要glEnableClientState当你设置好了。 的VAO记住每个指针的启用/禁用状态。

是的VAO将存储glEnableVertexAttribArrayglVertexAttrib 。 旧的顶点,法线,颜色,...阵列是相同的属性阵列,顶点==#0等。



Answer 2:

顶点数组对象是像文字处理程序和类似的宏 。 一个很好的描述中找到这里 。

宏只记得你做的动作,如激活该属性,当你调用bind该缓冲区等glBindVertexArray( yourVAOId )它只是重播这些属性指针绑定和绑定缓冲。

所以,你的下一个电话绘制任何由VAO结合使用。

VAO的不存储顶点数据 。 号的顶点数据存储在顶点缓冲器或在客户端存储器的阵列。



Answer 3:

VAO是代表顶点取的OpenGL管道的阶段和用于提供输入到顶点着色器的对象。

您可以创建这样的顶点数组对象

GLuint vao;
glCreateVertexArrays(1, &vao);
glBindVertexArray(vao);

首先,让我们做一个简单的例子。 在着色器代码考虑这样的输入参数

layout (location = 0) in vec4 offset; // input vertex attribute

为了填补这个属性我们可以使用

glVertexAttrib4fv(0, attrib); // updates the value of input attribute 0

虽然顶点数组对象存储这些静态的属性值对你来说,它可以做更多的事情。

创建顶点数组对象之后,我们就可以开始在它的状态填充。 我们会问的OpenGL来填补它会自动使用存储在我们提供一个缓冲区对象中的数据。 每个顶点属性获取到从绑定到的几个顶点缓冲器绑定一个缓冲器获取数据。 为此目的,我们使用glVertexArrayAttribBinding(GLuint vao, GLuint attribindex, GLuint bindingindex) 此外,我们使用glVertexArrayVertexBuffer()函数将缓冲器绑定到顶点缓冲器绑定之一。 我们使用glVertexArrayAttribFormat()函数来描述数据的布局和格式,最后我们通过调用启用属性的自动灌装glEnableVertexAttribArray()

当启用顶点属性,OpenGL的将反馈数据基础上的格式和位置信息的顶点着色器您提供有glVertexArrayVertexBuffer()glVertexArrayAttribFormat() 当属性被禁用,顶点着色器将提供您的通话提供静态信息glVertexAttrib*()

// First, bind a vertex buffer to the VAO
glVertexArrayVertexBuffer(vao, 0, buffer, 0, sizeof(vmath::vec4));

// Now, describe the data to OpenGL, tell it where it is, and turn on automatic
// vertex fetching for the specified attribute
glVertexArrayAttribFormat(vao, 0, 4, GL_FLOAT, GL_FALSE, 0);

glEnableVertexArrayAttrib(vao, 0);

而在着色器代码

layout (location = 0) in vec4 position;

毕竟,你需要调用glDeleteVertexArrays(1, &vao)


你可以阅读的OpenGL OpenGL超级更好地理解它。



文章来源: What are Vertex Array Objects?