I'm loading and creating a shader program (that uses the Projection matrix in the vertex shader and sets the fragment's color to magenta in the fragment shader) and glGetError() reports no errors after glUseProgram().
When I call glGetUniformLocation, it returns -1 yet glGetError() returns GL_NO_ERROR.
Yet still the magenta cube shows up.
Here's my shader program creation code along with the code that attempts to set the uniform:
//Shader Program GLuint shaderProgram = 0; shaderProgram = glCreateProgram(); //Vertex shader GLuint vertexShader = glCreateShader( GL_VERTEX_SHADER ); GLchar* vertexSource = load_shader( "vertex.glsl" ); const GLchar** vShaderSource = (const GLchar**)&vertexSource; glShaderSource( vertexShader, 1, vShaderSource, NULL ); glCompileShader( vertexShader ); glAttachShader( shaderProgram, vertexShader ); delete[] vertexSource; vertexSource = NULL; //Fragment shader GLuint fragmentShader = glCreateShader( GL_FRAGMENT_SHADER ); GLchar* fragmentSource = load_shader( "fragment.glsl" ); const GLchar** fShaderSource = (const GLchar**)&fragmentSource; glShaderSource( fragmentShader, 1, fShaderSource, NULL ); glCompileShader( fragmentShader ); glAttachShader( shaderProgram, fragmentShader ); delete[] fragmentSource; fragmentSource = NULL; //Link and use program glLinkProgram( shaderProgram ); glUseProgram( shaderProgram ); GLenum err = glGetError(); if( err != GL_NO_ERROR ) { quit = true; } GLint uniform = glGetUniformLocation( shaderProgram, "test" ); std::cout << "Uniform: " << uniform << std::endl; err = glGetError(); if( err != GL_NO_ERROR ) { quit = true; } glUniform1f( uniform, 1.f );
Here's vertex.glsl
uniform mat4 LProj;uniform mat4 LMView;uniform float test;void main(){ gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; //Transforming The Vertex //gl_Position = LProj * gl_Vertex;}
uniform float test;void main(){ // Setting Each Pixel To Red gl_FragColor = vec4(1.0, 0.0, 1.0, 1.0);}