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;
};
You are not glLinkProgram
the shader program. So, between attaching the shaders to the program and detaching them again, you should add glLinkProgram(shaderProgram)
.