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.
You should try to disable the existing shaders one by one and see which one solves the error message you are experiencing. Start with the latest one which you added to the game and work your way down. You can cut paste the shaders to another location in-case you want to use them later on.
Most of the time, OpenGL errors point back to outdated or corrupt graphics card drivers. In this case, the best workaround is to update your video card driver.
OpenGL errors plaguing Minecrafters have often been cleared up by simply disabling the "Advanced OpenGL" option in the "video settings" menu (found in the "options" menu).
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: http://www.opengl.org/sdk/docs/man/xhtml/glGetUniformLocation.xml) 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: http://www.opengl.org/sdk/docs/man/xhtml/glUniform.xml) 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()
?
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With