Opengl Shader Uniform wird im Code nicht erkannt?
Ich versuche gerade OpenGl zu lernen. Und ich habe folgendes Problem, wenn ich mit glGetUniformLocation versuche meine Uniform vom Shader ausfindig zu machen findet er diesen uniform einfach nicht. Habt ihr eine Idee wieso?
Mein Code:
const char* vertexShaderSource = R"(
#version 460 core
uniform vec3 transformation;
in vec3 position;
out vec4 color;
void main()
{
gl_Position = vec4(position, 1.0);
color = vec4(1.0, 1.0, 0.0, 1.0);
}
)";
const char* fragmentShaderSource = R"(
#version 460 core
in vec4 color;
out vec4 outColor;
void main()
{
outColor = color;
}
)";
int main()
{
SDL_Init(SDL_INIT_VIDEO);
Window2D window2D("Debug", 800, 600);
gladLoadGL();
glViewport(0, 0, 800, 600);
//Dreieck vertices
float vertices[] = {
-0.5f, -0.5f, 0.0f,
0.5f, -0.5f, 0.0f,
0.0f, 0.5f, 0.0f
};
//Shader
//Vertex Shader
GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
glCompileShader(vertexShader);
//Fragment Shader
GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
//Programm
GLuint program = glCreateProgram();
glAttachShader(program, vertexShader);
glAttachShader(program, fragmentShader);
glLinkProgram(program);
//Uniform
GLint uniform = glGetUniformLocation(program, "transformation");
if (uniform == -1) {
std::cerr << "Error: Not Found" << std::endl;
}
//Shader
//VBO and VAO
GLuint VBO, VAO;
glGenVertexArrays(1, &VAO);
glGenBuffers(1, &VBO);
glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*) 0);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
while(window2D.windowRun() == false)
{
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glUseProgram(program);
glBindVertexArray(VAO);
glDrawArrays(GL_TRIANGLES, 0, 3);
}
window2D.closeWindow();
return 0;
}
Sonst funktioniert tatsächlich alles, das Dreieck wird Gelb angezeigt nur der Uniform funktioniert nicht.
1 Antwort
Von gutefrage auf Grund seines Wissens auf einem Fachgebiet ausgezeichneter Nutzer
CPP, Informatik, Programmieren & Softwareentwicklung
1.) Prüfe ob das Compilen und Linken der Shader erfolgreich war. Selbiges gilt für alle anderen Befehle die du aufrufst.
2.) Deine Uniform wird nicht verwendet und ist daher nicht "activ" und kann deshalb nicht gequeried werden.
Siehe:
name must be an active uniform variable name in program
https://registry.khronos.org/OpenGL-Refpages/gl4/html/glGetUniformLocation.xhtml
https://www.khronos.org/opengl/wiki/Uniform_(GLSL)#Active_uniforms