18
votes

I' trying to develop a basic game in iOS and OpenGL ES but I'm stuck on this problem with the uniforms, here is the code that passes the value to my uniform:

glBindVertexArrayOES(_vertexArray);

// Render the object with ES2
glUseProgram(self.shaderProgram);

glUniformMatrix4fv(uniformModelViewProjection, 1, 0, modelViewProjectionMatrix.m);

// Get uniform center position
glUniform4fv(uniformCenterPosition, 1, centerPosition.v);
// Get uniform time position
glUniform1f(uniformTime, time);

// Set the sampler texture unit to 0
glUniform1i(uniformTexture, 0);
glDrawArrays(GL_POINTS, 0, numVertices);

Notice that care has been taken to position the glUniform function preceded with glUseProgram and before the glDrawArrays call is made. The uniform locations look fine also as confirmed via tracing. Here is what I get when I run the OpenGL ES Analyzer tool in XCode:

enter image description here

It returns a GL_INVALID_OPERATION for glUniform4fv, notice that the values represented seem to be correct.

Here are the possible causes for the GL_INVALID_OPERATION error I found from the documentation:

  • there is no current program object.
  • the size of the uniform variable declared in the shader does not match the size indicated by the glUniform command.
  • one of the signed or unsigned integer variants of this function is used to load a uniform variable of type float, vec2, vec3, vec4, or an array of these, or if one of the floating-point variants of this function is used to load a uniform variable of type int, ivec2, ivec3, ivec4, unsigned int, uvec2, uvec3, uvec4, or an array of these.
  • one of the signed integer variants of this function is used to load a uniform variable of type unsigned int, uvec2, uvec3, uvec4, or an array of these.
  • one of the unsigned integer variants of this function is used to load a uniform variable of type int, ivec2, ivec3, ivec4, or an array of these.
  • location is an invalid uniform location for the current program object and location is not equal to -1.
  • count is greater than 1 and the indicated uniform variable is not an array variable.
  • a sampler is loaded using a command other than glUniform1i and glUniform1iv.

None of them seem to explain why the heck I am receiving this error. It's driving me crazy, please help!

1
The only causes from the list that I could imagine are points 2 and 3. So is the corresponding uniform variable really declared as vec4 in the shader (maybe it's vec3)? Otherwise +1 for the extensive analysis (though, the shader code would have been nice, too).Christian Rau
You got the point! I overlooked the uniform dimension after changes I made some time ago, I had uniform vec3 ucenterp for my centerPosition value, after I changed it to vec4 the error has gone forever :) Thanks so much for helping. CheersPupillam
@ChristianRau I think he wants you to add your comment as an answer ;)user207616

1 Answers

11
votes

Adding my comment as an answer, since it turned out to be the solution:

The only causes from that list that I could imagine are points 2 and 3:

  • the size of the uniform variable declared in the shader does not match the size indicated by the glUniform command.
  • one of the signed or unsigned integer variants of this function is used to load a uniform variable of type float, vec2, vec3, vec4, or an array of these, or if one of the floating-point variants of this function is used to load a uniform variable of type int, ivec2, ivec3, ivec4, unsigned int, uvec2, uvec3, uvec4, or an array of these.

So make sure that the corresponding uniform variable is really declared as vec4 in the shader (maybe it's a vec3?).