Search code examples
javaopenglshaderlwjgl

Fragment Shader doesn't seem to output any colors


I recently decided to start Learning OpenGL and got myself a book about OpenGL Core 3.3. The book is generally about C++.

So, after looking for a bit, I found a library in a language I was better in which provided almost the same functionality: lwjgl. I managed to draw several shapes with basic vertex and fragment shaders. When I tried getting the Fragment shader to output a color other than white though, it didn't affect anything; The shapes are still getting rendered in white.

My question is if something is wrong with the shader itself or if i didn't load it up correctly. The code in my Main.java(The ShaderLoader is simply a class that loads .vs(vertex shader) and .fs(fragment shader) files):

 try {
            String vshaderSource, fshaderSource;
            vshaderSource = ShaderLoader.loadShaderSource(vertexShader, Path.of("main.vs"));
            glShaderSource(vertexShader, vshaderSource);
            fshaderSource = ShaderLoader.loadShaderSource(fragmentShader, Path.of("main.fs"));
            
            glShaderSource(fragmentShader, fshaderSource);
        } catch (IOException e) {
            log.severe(String.format("Loading of Shaders failed due to IOException: %s", e.getMessage()));
            return;
        } 
        glCompileShader(vertexShader);
        int success = glGetShaderi(vertexShader, GL_COMPILE_STATUS);
        String infoLog;
        if(success == 0) {
            infoLog = glGetShaderInfoLog(vertexShader);
            log.severe("Shader Compilation failed: " + infoLog);
        }
        glCompileShader(fragmentShader);
        success = glGetShaderi(fragmentShader, GL_COMPILE_STATUS);
        if(success == 0) {
            infoLog = glGetShaderInfoLog(fragmentShader);
            log.severe("Shader Compilation failed:" + infoLog);
        }
        int shaderProgram = glCreateProgram();
        glAttachShader(shaderProgram, vertexShader);
        glAttachShader(shaderProgram, fragmentShader);
        glDeleteShader(vertexShader);
        glDeleteShader(fragmentShader);
        glUseProgram(shaderProgram);
        //In the rendering Loop
        glUseProgram(shaderProgram);
                
        glBindVertexArray(VAO); 

        glUseProgram(shaderProgram);

        glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);

Vertex Shader main.vs:

#version 330 core
layout (location = 0) in vec3 aPos;

out vec4 vertexColor;

void main()
{
    gl_Position = vec4(aPos, 1.0);
    vertexColor = vec4(0.5, 0.0, 0.0, 1);
}

fragment shader main.fs:

#version 330 core
   in vec4 vertexColor;
   out vec4 FragColor;
   void main()
    {
       FragColor = vertexColor;
    };

Solution

  • You are not glLinkProgram the shader program. So, between attaching the shaders to the program and detaching them again, you should add glLinkProgram(shaderProgram).