Difference between revisions of "Vertex Array Object"

From OpenGL Wiki
Jump to navigation Jump to search
(Adding to objects category.)
(Removing nonsense information. And adding some proper formatting.)
Line 1: Line 1:
You might also want to read glVertexAttribPointer which is at http://www.opengl.org/wiki/GlVertexAttribPointer<br>
+
You might also want to read glVertexAttribPointer which is at [[GLVertexAttribPointer]]
<br>
+
 
GL 3.0 introduces VAO (Vertex Array Object). It also introduces Generic Vertex Attributes (glVertexAttribPointer).<br>
+
GL 3.0 introduces VAO (Vertex Array Object).
GL 1.5 introduced VBO (Vertex Buffer Object) which you can read about http://www.opengl.org/wiki/General_OpenGL<br>
+
 
They have created GL_ARB_vertex_array_object so that GL 2.0 implementations can also have support for VAO (if the IHV driver programmers
+
They have created GL_ARB_vertex_array_object so that GL 2.0 implementations can also have support for VAO (if the IHV driver programmers choose to offer it)
choose to offer it)<br>
+
 
<br>
 
 
== Introduction ==
 
== Introduction ==
One of the problems of OpenGL is validation. Whenever you make a GL call, the driver has to validate all sorts of things to make sure the GL state is ok and that actually executing the command won't hang the system. VAOs help in this area.<br>
+
One of the problems of OpenGL is validation. Whenever you make a GL call, the driver has to validate all sorts of things to make sure the GL state is ok and that actually executing the command won't hang the system. VAOs help in this area.
Instead of making a lot of glVertexAttribPointer calls, you just call glBindVertexArray.<br>
+
 
<br>
+
Instead of making a lot of glVertexAttribPointer calls, you just call glBindVertexArray.
 +
 
 
This is how you prepare a VAO.
 
This is how you prepare a VAO.
According to the spec, a VBO must be created and bound before calling glBindVertexArray and glVertexAttribPointer otherwise GL_INVALID_OPERATION will be generated
 
  glBindBuffer(GL_ARRAY_BUFFER, VertexVBOID);  //A previously created VBO
 
  uint VAOID;
 
  glGenVertexArrays(1, &VAOID);
 
  glBindVertexArray(VAOID);
 
  //Now we must define the VAO format
 
  //Vertices, XYZ, FLOAT. We give GL_FALSE since we don't want normalization
 
  glVertexAttribPointer(vertexLoc, 3, GL_FLOAT, GL_FALSE, sizeof(MyVertex), XXX);
 
  //Normals, XYZ, FLOAT.
 
  glVertexAttribPointer(normalLoc, 3, GL_FLOAT, GL_FALSE, sizeof(MyVertex), XXX);
 
  //TexCoord0, XY (Also called ST. Also called UV), FLOAT.
 
  glVertexAttribPointer(texCoord0Loc, 2, GL_FLOAT, GL_FALSE, sizeof(MyVertex), XXX);
 
  
The XXX are offsets into the VBO.<br>
+
<code>
Now the VAO is ready. To use it.
+
uint VAOID;
  glBindBuffer(GL_ARRAY_BUFFER, VertexVBOID);  //Necessary?
+
glGenVertexArrays(1, &VAOID);
  glBindVertexArray(VAOID);
+
glBindVertexArray(VAOID);
  glDrawRangeElements(...); //or glDrawElements, or glDrawArrays
+
//Now we must define the VAO format
 +
//Vertices, XYZ, FLOAT. We give GL_FALSE since we don't want normalization
 +
glBindBuffer(GL_ARRAY_BUFFER, VertexVBOID);  //A previously created VBO
 +
glVertexAttribPointer(vertexLoc, 3, GL_FLOAT, GL_FALSE, sizeof(MyVertex), XXX);
 +
//Normals, XYZ, FLOAT.
 +
glVertexAttribPointer(normalLoc, 3, GL_FLOAT, GL_FALSE, sizeof(MyVertex), XXX);
 +
//TexCoord0, XY (Also called ST. Also called UV), FLOAT.  
 +
glVertexAttribPointer(texCoord0Loc, 2, GL_FLOAT, GL_FALSE, sizeof(MyVertex), XXX);
 +
</code>
  
The spec doesn't make clear if calling glBindBuffer(GL_ARRAY_BUFFER, VertexVBOID) is necessary for drawing.<br>
+
The XXX are offsets into the VBO.
<br>
 
Calling glBindVertexArray(0) unbinds the VAO.<br>
 
Could you use glVertexPointer and the others with VAO? Probably. If you make a GL 3.0 forward compatible context, you can't use glVertexPointer and the others.<br>
 
  
 +
Now the VAO is ready. To use it.
  
 +
<code>
 +
glBindBuffer(GL_ARRAY_BUFFER, VertexVBOID);  //Necessary?
 +
glBindVertexArray(VAOID);
 +
glDrawRangeElements(...);  //or glDrawElements, or glDrawArrays
 +
</code>
  
== Delete ==
 
Don't forget to deallocate on shutdown. If you don't deallocate, the driver will automatically deallocate for you.
 
  glDeleteVertexArrays(1, &VAOID);
 
  
 
[[Category:Vertex Specification]]
 
[[Category:Vertex Specification]]
 
[[Category:Objects]]
 
[[Category:Objects]]

Revision as of 21:03, 17 August 2009

You might also want to read glVertexAttribPointer which is at GLVertexAttribPointer

GL 3.0 introduces VAO (Vertex Array Object).

They have created GL_ARB_vertex_array_object so that GL 2.0 implementations can also have support for VAO (if the IHV driver programmers choose to offer it)

Introduction

One of the problems of OpenGL is validation. Whenever you make a GL call, the driver has to validate all sorts of things to make sure the GL state is ok and that actually executing the command won't hang the system. VAOs help in this area.

Instead of making a lot of glVertexAttribPointer calls, you just call glBindVertexArray.

This is how you prepare a VAO.

uint VAOID; glGenVertexArrays(1, &VAOID); glBindVertexArray(VAOID); //Now we must define the VAO format //Vertices, XYZ, FLOAT. We give GL_FALSE since we don't want normalization glBindBuffer(GL_ARRAY_BUFFER, VertexVBOID); //A previously created VBO glVertexAttribPointer(vertexLoc, 3, GL_FLOAT, GL_FALSE, sizeof(MyVertex), XXX); //Normals, XYZ, FLOAT. glVertexAttribPointer(normalLoc, 3, GL_FLOAT, GL_FALSE, sizeof(MyVertex), XXX); //TexCoord0, XY (Also called ST. Also called UV), FLOAT. glVertexAttribPointer(texCoord0Loc, 2, GL_FLOAT, GL_FALSE, sizeof(MyVertex), XXX);

The XXX are offsets into the VBO.

Now the VAO is ready. To use it.

glBindBuffer(GL_ARRAY_BUFFER, VertexVBOID); //Necessary? glBindVertexArray(VAOID); glDrawRangeElements(...); //or glDrawElements, or glDrawArrays