1
votes

I am relatively new to OpenGL, so this question might seem a bit trivial. I have this code in my Main.java, which is supposed to output a rectangle with the texture of the image on it:

float vertices[] = {
                // positions          // colors           // texture coords
                 0.5f,  0.5f, 0.0f,   1.0f, 0.0f, 0.0f,   1.0f, 1.0f, // top right
                 0.5f, -0.5f, 0.0f,   0.0f, 1.0f, 0.0f,   1.0f, 0.0f, // bottom right
                -0.5f, -0.5f, 0.0f,   0.0f, 0.0f, 1.0f,   0.0f, 0.0f, // bottom left
                -0.5f,  0.5f, 0.0f,   1.0f, 1.0f, 0.0f,   0.0f, 1.0f  // top left 
            };
            int indices[] = {  
                0, 1, 3, // first triangle
                1, 2, 3  // second triangle
            };
            int VBO = glGenBuffers(), VAO = glGenVertexArrays(), EBO = glGenBuffers();

            glBindVertexArray(VAO);

            glBindBuffer(GL_ARRAY_BUFFER, VBO);
            glBufferData(GL_ARRAY_BUFFER, vertices, GL_STATIC_DRAW);

            glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
            glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices, GL_STATIC_DRAW);

            // position attribute
            glVertexAttribPointer(0, 3, GL_FLOAT, false, 8, 0);
            glEnableVertexAttribArray(0);
            // color attribute
            glVertexAttribPointer(1, 3, GL_FLOAT, false, 8, 2);
            glEnableVertexAttribArray(1);
            // texture coord attribute
            glVertexAttribPointer(2, 2, GL_FLOAT, false, 8, 5);
            glEnableVertexAttribArray(2);
        Texture texture = null;
        try {
            log.info("Loading texture");
            texture = Texture.loadTexture("texture.png");
        } catch (IOException e) {
            log.severe("Texture loading failed due to IOException: " + e.getMessage());
            e.printStackTrace();
        }
        
        
        while (!glfwWindowShouldClose(window))
            {
            
                

                glClear(GL_COLOR_BUFFER_BIT);
                
                if(mainProgram != null) {
                    mainProgram.use();
                }
                glBindTexture(GL_TEXTURE_2D, texture.getId());
                glBindVertexArray(VAO); 
                glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
                //...
            }

My shaders are the following: Vertex Shader:

#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aColor;
layout(location = 2) in vec2 aTexCoord;

out vec3 vertexColor;
out vec2 texCoord;

void main()
{
    gl_Position = vec4(aPos , 1.0);
    vertexColor = aColor;
    texCoord = aTexCoord;
}

Fragment Shader:

#version 330 core
out vec4 FragColor;

in vec3 ourColor;
in vec2 TexCoord;

// texture sampler
uniform sampler2D texture1;

void main()
{
    FragColor = texture(texture1, TexCoord);
}

The Texture class referenced above is the following:

public class Texture {
   public static Texture loadTexture(String fileName) throws IOException{

       //load png file
       PNGDecoder decoder = new PNGDecoder(new java.io.FileInputStream(new File("C:/Users/Using/Absolute/Paths/For/Demonstration/texture.png")));

       //create a byte buffer big enough to store RGBA values
       ByteBuffer buffer = BufferUtils.createByteBuffer(4 * decoder.getWidth() * decoder.getHeight());

       //decode
       decoder.decode(buffer, decoder.getWidth() * 4, PNGDecoder.Format.RGBA);

       //flip the buffer so its ready to read
       buffer.flip();

       //create a texture
       int id = glGenTextures();

       //bind the texture
       glBindTexture(GL_TEXTURE_2D, id);

       //tell opengl how to unpack bytes
       glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

       //set the texture parameters, can be GL_LINEAR or GL_NEAREST
       glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
       glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

       //upload texture
       glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, decoder.getWidth(), decoder.getHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer);

       // Generate Mip Map
       glGenerateMipmap(GL_TEXTURE_2D);

       return new Texture(id); 
   }
    private int id;

    public Texture(int id){
        this.id = id;
    }

    public int getId(){
        return id;
    }
}

Note that the path of the texture image is not the problem, as the code works without any Exceptions or Compiler errors. The PNGDecoder i used can be found here.

1
No, it is not... i did check that i use the values you supplied, but it still isn't displaying the texture - PhoenixXKN
So there is another issue related to the lading or decoding the texture. - Rabbid76

1 Answers

1
votes

The stride and offset argument must be set in bytes when specifying the array of generic vertex attribute data by glVertexAttribPointer.
Furthermore, the uv coordinates are the 7th and 8th element in the attribute tuple:

glVertexAttribPointer(0, 3, GL_FLOAT, false, 8, 0);

glVertexAttribPointer(0, 3, GL_FLOAT, false, 8*4, 0);

glVertexAttribPointer(1, 3, GL_FLOAT, false, 8, 2);

glVertexAttribPointer(1, 3, GL_FLOAT, false, 8*4, 3*4);

glVertexAttribPointer(2, 2, GL_FLOAT, false, 8, 5);

glVertexAttribPointer(2, 2, GL_FLOAT, false, 8*4, 6*4);