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 SuperBible以更好地理解它。
''顶点数组对象'由OpenGL ARB小组委员会为您提供。是的,一个存储**顶点** **数组**绑定的**对象**这样一个愚蠢的名字。 – 2012-08-06 01:34:26
如果我正确地理解你,调用'glGenVertexArrays(1,&VaoId);'和'glBindVertexArray(VaoId);'创建一个VAO,并使用理智的默认值将你从'glEnableClientState'中解救出来?或者我完全误解了你?将来我会使用很多'glEnableClientState'吗? – Patrick 2012-08-06 02:13:49
此外,所有与“glVertexAttribPointer”相关的VAOs – Patrick 2012-08-06 02:16:19