I'm trying to draw a quad for a background (2D) using OpenGL 3.x+. Quads are deprecated, so the goal is to use two triangles to make a rectangle that fills the screen. It's working, but I'm not 100% clear on everything here.
Setup
GLuint positionBufferObject;
GLfloat vertexPositions[] =
{
-1.0f, -1.0f, 0.0f, 1.0f,
-1.0f, 1.0f, 0.0f, 1.0f,
1.0f, 1.0f, 0.0f, 1.0f,
1.0f, -1.0f, 0.0f, 1.0f,
-1.0f, -1.0f, 0.0f, 1.0f,
};
glGenBuffers(1, &positionBufferObject);
glBindBuffer(GL_ARRAY_BUFFER, positionBufferObject);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertexPositions), vertexPositions, GL_STATIC_DRAW);
vertexPositions
, it's an array of vertices.glGenBuffers()
is saying, I want 1 buffer and assign id to &positionBufferObject
?glBufferData()
uploads the vertexPositions
to the GPU's memory; but how does it know were to upload it since I didn't give it an ID? Draw
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 5);
glDisableVertexAttribArray(0);
glEnableVertexAttribArray()
just says I'm going to be drawing with array 0?glDrawArrays()
- what if I want to draw two vertex arrays? How does it know which ones to render? It knows that from the above command?glVertexAttribPointer()
does?glDrawArrays()
is clear.Clean up, I think this is right?
glBindBuffer(GL_ARRAY_BUFFER, 0);
glDeleteBuffers(1, &positionBufferObject);
I only do the setup/cleanup once.
Bonus points:
glGenBuffers(1, &positionBufferObject);
says "make a vertex buffer object, and positionBufferObject
is its ID."
glBindBuffer(GL_ARRAY_BUFFER, positionBufferObject);
says "positionBufferObject
is now the current GL_ARRAY_BUFFER
."
glBufferData(GL_ARRAY_BUFFER, sizeof(vertexPositions), vertexPositions, GL_STATIC_DRAW);
says "upload vertexPositions
to the ID currently bound to GL_ARRAY_BUFFER
(which is positionBufferObject
)."
glEnableVertexAttribArray(0);
says "vertex attribute array 0 is now available for use."
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);
says "vertex attribute array 0 is to be interpreted as consisting of groups of 4 floats."
glDrawArrays(GL_TRIANGLE_STRIP, 0, 5);
says "draw a triangle strip with five indices from every enabled array."
glDisableVertexAttribArray(0);
says "we're done for the time being with vertex attribute array 0."