OpenGL Shader error 1282

I am trying to add lighting to my current scene of a simple cube. After setting up my uniforms I get a 1282 error from glGetError() for this piece of code

GLuint ambientHandle = glGetUniformLocation(program->getHandle(), "ambientProduct"); glUniform4fv( ambientHandle, 1, ambientProduct ); GLuint diffuseHandle = glGetUniformLocation(program->getHandle(), "diffuseProduct"); glUniform4fv( diffuseHandle, 1, diffuseProduct ); GLuint specularHandle = glGetUniformLocation(program->getHandle(), "specularProduct"); glUniform4fv( specularHandle, 1, specularProduct ); GLuint lightPosHandle = glGetUniformLocation(program->getHandle(), "lightPosition"); glUniform4fv( lightPosHandle, 1, light.position ); GLuint shinyHandle = glGetUniformLocation(program->getHandle(), "shininess"); glUniform1f( shinyHandle, materialShininess ); 

Here are my shaders: vertex.glsl

#version 120 attribute vec4 coord3d; attribute vec3 normal3d; // output values that will be interpretated per-fragment varying vec3 fN; varying vec3 fE; varying vec3 fL; uniform vec4 lightPosition; uniform mat4 mTransform; void main() { fN = normal3d; fE = coord3d.xyz; fL = lightPosition.xyz; if( lightPosition.w != 0.0 ) { fL = lightPosition.xyz - coord3d.xyz; } gl_Position = mTransform*coord3d; } 

fragment.glsl

// per-fragment interpolated values from the vertex shader varying vec3 fN; varying vec3 fL; varying vec3 fE; uniform vec4 ambientProduct, diffuseProduct, specularProduct; uniform mat4 mTransform; uniform vec4 lightPosition; uniform float shininess; void main() { // Normalize the input lighting vectors vec3 N = normalize(fN); vec3 E = normalize(fE); vec3 L = normalize(fL); vec3 H = normalize( L + E ); vec4 ambient = ambientProduct; float Kd = max(dot(L, N), 0.0); vec4 diffuse = Kd*diffuseProduct; float Ks = pow(max(dot(N, H), 0.0), shininess); vec4 specular = Ks*specularProduct; // discard the specular highlight if the light's behind the vertex if( dot(L, N) < 0.0 ) { specular = vec4(0.0, 0.0, 0.0, 1.0); } gl_FragColor = ambient + diffuse + specular; gl_FragColor.a = 1.0; } 

The products and position are each a struct of three GLfloats and shininess is a float. I have checked all of the values of the handles and the values I am passing and they all seem valid. Ideas?

--EDIT: I have narrowed it to the glUniform4fv calls. It happens after each one. Also I have double checked that the program->getHandle() is pointing to something that looks valid.

I have checked program->getHandle is a valid program Here are the values of all handles: Program handle 3 ambientHandle 0 diffuseHandle 1 specularHandle 5 lightPosHandle 2 shinyHandle 4

So they all look good. For testing I am commenting out the lines below the ones for ambientProduct. For clarity I am explicitly using this line instead

glUniform4f( ambientHandle, ambientProd.x, ambientProd.y, ambientProd.z, ambientProd.w ); 

These are the values for ambientProd at the time that line is executed. x = 0.200000003, y = 0.0, z = 0.200000003, w = 1.0

A collaborator on this project moved the call for glUseProgram. Thanks for the help folks.

0

2 Answers

Error number ´1282` is not very descriptive.

Possible error codes for glGetUniformLocation are:

GL_INVALID_VALUE GL_INVALID_OPERATION 

Which don't have a fixed value. Try to get the error string with gluErrorString() or take a look in the header to which of those 1282 maps.

Just a shot in the dark: but did you ...

  • check your shader got compiled without error?

  • check your shader got linked without error?

BTW: return type is GLint not GLuint

"Shaders compiled and linked without error" Hmm, this looks odd.

According to spec (see: ) GL_INVALID_OPERATION should only be generated if:

  • program is not a program objec

  • program has not been successfully linked

Other question:

  • are you sure the getHandle()method of the class your program Object belongs to returns the right id. I mean the one that was used in the sucessfully linking.

    you should be able to verify with checking if glIsProgram(program-getHandle()) returns GL_TRUE

EDIT: Ah - I missed those calls to glUniform4fv in your example.

Correct return type for glGetUniformLocation is still GLint, but I don't think thats the problem.

According to spec (see: ) GLUniformXX generates GL_INVALID_OPERATION for a whole bunch of reasons. To me the only one that possibly seems to apply is:

  • there is no current program object

    Did you call glUseProgram (program->getHandle()) prior to trying to calling glUniform()?

3

Generally this error number occurs when you are using a different programID from the programID generated by openGL at the time of creating the shader. It means that you are using a different programID at the time of binding vertexShader or fragmentShader or whatever other shader you are using.

1

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

You Might Also Like