nondescript

07-21-2014, 04:36 PM

i am a newbie at Open GL and came here to clear out a confusion i had. I appreciate any help!

private int vbo;

private int ibo;

vbo = glGenBuffers();

ibo = glGenBuffers();

glBindBuffer(GL_ARRAY_BUFFER, vbo);

glBufferData(GL_ARRAY_BUFFER, Util.createFlippedBuffer(vertices), GL_STATIC_DRAW);

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);

glBufferData(GL_ELEMENT_ARRAY_BUFFER, Util.createFlippedBuffer(indices), GL_STATIC_DRAW);

glEnableVertexAttribArray(0);

glEnableVertexAttribArray(1);

//glEnableVertexAttribArray(2);

//glBindBuffer(GL_ARRAY_BUFFER, vbo);

glVertexAttribPointer(0, 3, GL_FLOAT, false, Vertex.SIZE * 4, 0);

glVertexAttribPointer(1, 2, GL_FLOAT, false, Vertex.SIZE * 4, 12);

//glVertexAttribPointer(2, 3, GL_FLOAT, false, Vertex.SIZE * 4, 20);

//glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);

glDrawElements(GL_TRIANGLES, size, GL_UNSIGNED_INT, 0);

glDisableVertexAttribArray(0);

glDisableVertexAttribArray(1);

//glDisableVertexAttribArray(2);

The vertex shader code looks like

#version 330

layout (location = 0) in vec3 position;

layout (location = 1) in vec2 texCoord;

out vec2 texCoord0;

uniform mat4 transform;

void main()

{

gl_Position = transform * vec4(position, 1.0);

texCoord0 = texCoord;

}

So, here is my understanding. The purpose of glVertexAttribPointer is to define the format of data in the vertex buffer object. So, in vbo it stores data as follows

buffer.put(vertices[i].getPos().getX());

buffer.put(vertices[i].getPos().getY());

buffer.put(vertices[i].getPos().getZ());

buffer.put(vertices[i].getTexCoord().getX());

buffer.put(vertices[i].getTexCoord().getY());

buffer.put(vertices[i].getNormal().getX());

buffer.put(vertices[i].getNormal().getY());

buffer.put(vertices[i].getNormal().getZ());

So, we have two glVertexAttribPointer lines because we have two variables defined in the vertex shader. So basically we are defining what these two variables point to. So, the first glVertexAttribPointer defines that the first variable "position" is a vertex with three coordinates each being float. The second glVertexAttribPointer defines the second variable "texCoord" being a pair of texture coordinates each being float. So, if my understanding is correct so far then i was assuming we first need to bind the vertex buffer object first but even after commenting out this line

glBindBuffer(GL_ARRAY_BUFFER, vbo);

it still works. I am confused. How does it know which buffer object we are talking about since there are two vbos?

I appreciate any help. Thanks a lot!

private int vbo;

private int ibo;

vbo = glGenBuffers();

ibo = glGenBuffers();

glBindBuffer(GL_ARRAY_BUFFER, vbo);

glBufferData(GL_ARRAY_BUFFER, Util.createFlippedBuffer(vertices), GL_STATIC_DRAW);

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);

glBufferData(GL_ELEMENT_ARRAY_BUFFER, Util.createFlippedBuffer(indices), GL_STATIC_DRAW);

glEnableVertexAttribArray(0);

glEnableVertexAttribArray(1);

//glEnableVertexAttribArray(2);

//glBindBuffer(GL_ARRAY_BUFFER, vbo);

glVertexAttribPointer(0, 3, GL_FLOAT, false, Vertex.SIZE * 4, 0);

glVertexAttribPointer(1, 2, GL_FLOAT, false, Vertex.SIZE * 4, 12);

//glVertexAttribPointer(2, 3, GL_FLOAT, false, Vertex.SIZE * 4, 20);

//glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);

glDrawElements(GL_TRIANGLES, size, GL_UNSIGNED_INT, 0);

glDisableVertexAttribArray(0);

glDisableVertexAttribArray(1);

//glDisableVertexAttribArray(2);

The vertex shader code looks like

#version 330

layout (location = 0) in vec3 position;

layout (location = 1) in vec2 texCoord;

out vec2 texCoord0;

uniform mat4 transform;

void main()

{

gl_Position = transform * vec4(position, 1.0);

texCoord0 = texCoord;

}

So, here is my understanding. The purpose of glVertexAttribPointer is to define the format of data in the vertex buffer object. So, in vbo it stores data as follows

buffer.put(vertices[i].getPos().getX());

buffer.put(vertices[i].getPos().getY());

buffer.put(vertices[i].getPos().getZ());

buffer.put(vertices[i].getTexCoord().getX());

buffer.put(vertices[i].getTexCoord().getY());

buffer.put(vertices[i].getNormal().getX());

buffer.put(vertices[i].getNormal().getY());

buffer.put(vertices[i].getNormal().getZ());

So, we have two glVertexAttribPointer lines because we have two variables defined in the vertex shader. So basically we are defining what these two variables point to. So, the first glVertexAttribPointer defines that the first variable "position" is a vertex with three coordinates each being float. The second glVertexAttribPointer defines the second variable "texCoord" being a pair of texture coordinates each being float. So, if my understanding is correct so far then i was assuming we first need to bind the vertex buffer object first but even after commenting out this line

glBindBuffer(GL_ARRAY_BUFFER, vbo);

it still works. I am confused. How does it know which buffer object we are talking about since there are two vbos?

I appreciate any help. Thanks a lot!