\$\begingroup\$

I'm going through open.gl tutorials. I'm at the point where I want to apply textures. The tutorial first introduces texture coordinates to the vertices[] array, and then adding the corresponding in , out and uniform variables accordingly on each shader. The issue I'm having with is OpenGL cannot interpret the vertex attributes correctly with the given stride and offset parameters when I change the structure of the vertices[] array, as seen on the second half of the code below.

float vertices[] = {// X Y R G B -0.5f, +0.5f, 1.0f, 0.0f, 0.0f, // Top-left +0.5f, +0.5f, 0.0f, 1.0f, 0.0f, // Top-right +0.5f, -0.5f, 0.0f, 0.0f, 1.0f, // Bottom-right -0.5f, -0.5f, 1.0f, 1.0f, 1.0f // Bottom-left }; GLuint elements[] = { 0, 1, 2, 2, 3, 0 }; GLint posAttrib = glGetAttribLocation(_shaderProgram.program, "position"); // handle to vert shader argument glEnableVertexAttribArray(posAttrib); glVertexAttribPointer(posAttrib, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), 0); // how to interpret input array // position, vec2, type, normalize mode, stride, offset GLint colAttrib = glGetAttribLocation(_shaderProgram.program, "color"); glEnableVertexAttribArray(colAttrib); glVertexAttribPointer(colAttrib, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)(2 * sizeof(float))); // Draw call glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);

vert.glsl

#version 150 in vec2 position; in vec3 color; out vec3 Color; uniform mat4 model; uniform mat4 view; uniform mat4 proj; void main() { Color = color; gl_Position = proj * view * model * vec4(position, 0.0, 1.0); }

frag.glsl

#version 150 in vec3 Color; out vec4 outColor; uniform sampler2D tex; void main() { outColor = vec4(Color, 1.0); }

However, when I want to introduce texture coordinates in the vertices[] array like this, I get weird shapes. OpenGL for some reason cannot interpret the vertices[] array correctly.

float vertices[] = {// X Y R G B S T -0.5f, +0.5f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f // Top-left +0.5f, +0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f // Top-right +0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f // Bottom-right -0.5f, -0.5f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f // Bottom-left }; GLuint elements[] = { 0, 1, 2, 2, 3, 0 }; GLint posAttrib = glGetAttribLocation(_shaderProgram.program, "position"); // handle to vert shader argument glEnableVertexAttribArray(posAttrib); glVertexAttribPointer(posAttrib, 2, GL_FLOAT, GL_FALSE, 7 * sizeof(float), 0); // how to interpret input array // position, vec2, type, normalize mode, stride, offset GLint colAttrib = glGetAttribLocation(_shaderProgram.program, "color"); glEnableVertexAttribArray(colAttrib); glVertexAttribPointer(colAttrib, 3, GL_FLOAT, GL_FALSE, 7 * sizeof(float), (void*)(2 * sizeof(float))); GLint texAttrib = glGetAttribLocation(_shaderProgram.program, "texcoords"); glEnableVertexAttribArray(texAttrib); glVertexAttribPointer(texAttrib, 2, GL_FLOAT, GL_FALSE, 7 * sizeof(float), (void*)(5 * sizeof(float))); // Draw call (same as before) glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);

vert.glsl

#version 150 in vec2 position; in vec3 color; in vec2 texcoords; out vec3 Color; out vec2 TexCoord; uniform mat4 model; uniform mat4 view; uniform mat4 proj; void main() { Color = color; TexCoord = texcoords; gl_Position = proj * view * model * vec4(position, 0.0, 1.0); }

frag.glsl

#version 150 in vec3 Color; in vec2 TexCoord; out vec4 outColor; uniform sampler2D tex; void main() { // i know the pixel color computation doesn't make sense here, as I also // do not provide the texture uniform variable. But I'm aware of the // glsl compiler optimizations stripping away unused attributes, so here // I use it in a meaningless way so that its not optimized out. I just // want to make sure the interpretation of the vertex attributes are // correct, so that I can start getting the texture right on the correct geometry. outColor = vec4(Color, 1.0) + texture(tex, TexCoord); }

From the output I get, I conclude that OpenGL somehow having hard time interpreting the vertex array with the given attribute stride and offset parameters. What causes this - what am I missing - and how do I get this right?