karnivaurus

08-07-2015, 10:40 AM

I want to render a mesh using OpenGL and shaders. So, first I create an array which stores the list of vertices, where each vertex is represented by 7 floats: 3 for position, and 4 for colour:

GLfloat vertices[] = {x1, y1, z1, r1, g1, b1, a1, x2, y2, z2, r2, g2, b2, a2, x1, y3, z3, r3, g3, b3, a3 ........};

Then, I tell OpenGL how to interpret this data:

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 7 * sizeof(GL_FLOAT), 0);

glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 7 * sizeof(GL_FLOAT), (void*)(3 * sizeof(GL_FLOAT)));

Then, in my vertex shader, I extract the position and colour of each vertex:

layout (location = 0) in vec3 vertex_position;

layout (location = 1) in vec4 vertex_colour;

uniform mat4 projection_matrix;

uniform mat4 view_matrix;

out vec4 frag_colour;

void main()

{

gl_Position = projection_matrix * view_matrix * vec4(vertex_position, 1.0f);

frag_colour = vertex_colour;

}

Finally, I set the colour in my fragment shader:

in vec4 frag_colour;

void main()

{

gl_FragColor = frag_colour;

}

However, no matter what values I use for `(r, g, b, a)` for each vertex, it always renders the model in red. In fact, if I debug in the vertex shader, it turns out that the `vertex_position` variable is not the same as the one I originally loaded into the vertex buffer.

What am I doing wrong?

GLfloat vertices[] = {x1, y1, z1, r1, g1, b1, a1, x2, y2, z2, r2, g2, b2, a2, x1, y3, z3, r3, g3, b3, a3 ........};

Then, I tell OpenGL how to interpret this data:

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 7 * sizeof(GL_FLOAT), 0);

glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 7 * sizeof(GL_FLOAT), (void*)(3 * sizeof(GL_FLOAT)));

Then, in my vertex shader, I extract the position and colour of each vertex:

layout (location = 0) in vec3 vertex_position;

layout (location = 1) in vec4 vertex_colour;

uniform mat4 projection_matrix;

uniform mat4 view_matrix;

out vec4 frag_colour;

void main()

{

gl_Position = projection_matrix * view_matrix * vec4(vertex_position, 1.0f);

frag_colour = vertex_colour;

}

Finally, I set the colour in my fragment shader:

in vec4 frag_colour;

void main()

{

gl_FragColor = frag_colour;

}

However, no matter what values I use for `(r, g, b, a)` for each vertex, it always renders the model in red. In fact, if I debug in the vertex shader, it turns out that the `vertex_position` variable is not the same as the one I originally loaded into the vertex buffer.

What am I doing wrong?