Help me understand OpenGL glGenBuffers ()

Here's the thing: if I leave the code with glGenBuffers(1, vertexBuffers) , the code compiles and works. But I thought it should be 2 since vertexBuffers is two in size.

Did I miss something?

Code below:

 -(void)drawRect:(NSRect)dirtyRect { // get program ID for shader program GLuint programID = [self loadShaders]; // get new dimensions NSSize dim = [self frame].size; // clear the background with color glClearColor(0.0, 0.0, 0.0, 0.4); glDepthRange(0.1, 100.0); glViewport(0, 0, dim.width, dim.height); glClear(GL_COLOR_BUFFER_BIT); // vertex data GLfloat vertexPositionData[] = {-dim.width/2, -dim.height/2, 0.0, 5.0, dim.width/2, -dim.height/2, 0.0, 5.0, 0.0, dim.height/2, 0.0, 5.0}; GLfloat vertexColorData[] = {1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.5, 0.0, 0.0, 1.0, 0.5}; GLfloat scaleMatrixData[] = {1/(dim.width/2), 0.0, 0.0, 0.0, 0.0, 1/(dim.height/2), 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0}; GLint scaleMatrixUniform = glGetUniformLocation(programID, "scaleMatrix"); // generate a buffer for our triangle glGenBuffers(1, vertexBuffers); glBindBuffer(GL_ARRAY_BUFFER, vertexBuffers[0]); glBufferData(GL_ARRAY_BUFFER, sizeof(vertexPositionData), vertexPositionData, GL_STATIC_DRAW); glBindBuffer(GL_ARRAY_BUFFER, vertexBuffers[1]); glBufferData(GL_ARRAY_BUFFER, sizeof(vertexColorData), vertexColorData, GL_STATIC_DRAW); //glBindBuffer(GL_ARRAY_BUFFER, 0); glUseProgram(programID); glBindBuffer(GL_ARRAY_BUFFER, vertexBuffers[0]); glEnableVertexAttribArray(VERTEX_POS_INDEX); glBindBuffer(GL_ARRAY_BUFFER, vertexBuffers[1]); glEnableVertexAttribArray(VERTEX_COLOR_INDEX); glVertexAttribPointer(VERTEX_POS_INDEX, VERTEX_POS_SIZE, GL_FLOAT, GL_FALSE, 0, vertexPositionData); glVertexAttribPointer(VERTEX_COLOR_INDEX, VERTEX_COLOR_SIZE, GL_FLOAT, GL_FALSE, 0, vertexColorData); glUniformMatrix4fv(scaleMatrixUniform, 1, GL_FALSE, scaleMatrixData); glDrawArrays(GL_TRIANGLES, 0, 3); glDisableVertexAttribArray(0); glDisableVertexAttribArray(1); glUseProgram(0); // flush buffer glFlush(); [[self openGLContext] flushBuffer]; } 
+5
source share
3 answers

glGenBuffers does not work as you expect. When you call glGenBuffers , it actually creates nothing. It simply returns a list of integers that are not currently used as buffer names.

The actual "object" is not created until you name glBindBuffer . That way, you can simply create any integer you like and pass it to glBindBuffer, and a valid buffer will be created in this index. glGenBuffers is actually not required at all, it is just as a convenience function to give you an unused integer.

So, if you just create an array of random integers, if none of them overlap, you can use this as a list of buffers without calling glGenBuffers . This is why your code works if you tell glGenBuffers to create 1 or 2 buffers. As long as you have two buffers with two different names, it doesn't matter where the integer comes from.

Little demo:

 int buf; glGenBuffers(1, &buf); glIsBuffer(buf); //FALSE - buffer has not been created yet glBindBuffer(GL_ARRAY_BUFFER, buf); glIsBuffer(buf); //TRUE - buffer created on bind 
+21
source

Assuming vertexBuffers declared as something like:

 GLuint vertexBuffers[2]; 

then your code probably doesn't quite do what you think. The first argument to glGenBuffers() is the number of buffers you want to generate, and the second argument is a pointer to an array of multiple buffers. Therefore, you probably want to do:

 glGenBuffers (2, vertexBuffers); 

This tells OpenGL to generate 2 buffer names and store them in 2 contiguous locations in memory, starting with the vertexBuffers address.

+8
source

I realized this yesterday, I need to do glBindBuffer (GL_ARRAY_BUFFER, 0) after each glBufferData (...).

+2
source

All Articles