glUniform4fv给出了GL_INVALID_OPERATION

时间:2013-02-05 11:13:37

标签: iphone ios opengl-es shader

我试图在iOS和OpenGL ES中开发一个基本游戏,但我仍然坚持使用制服这个问题,这里是将值传递给我的制服的代码:

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);

请注意,在glDseProgram之前和glDrawArrays调用之前,已经注意定位glUniform函数。通过追踪确认均匀位置也很好。以下是我在XCode中运行OpenGL ES Analyzer工具时得到的结果:

enter image description here

它返回glUniform4fv的GL_INVALID_OPERATION,注意表示的值似乎是正确的。

以下是我从documentation找到的GL_INVALID_OPERATION错误的可能原因:

  • 目前没有程序对象。
  • 着色器中声明的统一变量的大小与glUniform命令指示的大小不匹配。
  • 此函数的有符号或无符号整数变体之一用于加载float,vec2,vec3,vec4或其数组的统一变量,或者如果此函数的某个浮点变量是用于加载int,ivec2,ivec3,ivec4,unsigned int,uvec2,uvec3,uvec4或其数组的统一变量。
  • 此函数的一个有符号整数变体用于加载unsigned int,uvec2,uvec3,uvec4或其数组的统一变量。
  • 此函数的一个无符号整数变体用于加载int,ivec2,ivec3,ivec4或其数组的统一变量。
  • location是当前程序对象的无效统一位置,位置不等于-1。
  • count大于1且指示的统一变量不是数组变量。
  • 使用glUniform1i和glUniform1iv以外的命令加载采样器。

他们似乎没有解释为什么我收到这个错误。它让我发疯,请帮忙!

1 个答案:

答案 0 :(得分:9)

添加我的评论作为答案,因为它原来是解决方案:

我能想象的唯一原因是第2点和第3点:

  
      
  • 着色器中声明的统一变量的大小与glUniform命令指示的大小不匹配。
  •   
  • 此函数的有符号或无符号整数变体之一用于加载float,vec2,vec3,vec4或者类型的统一变量   这些的数组,或者如果是其中一个浮点变体   function用于加载int,ivec2,ivec3类型的统一变量,   ivec4,unsigned int,uvec2,uvec3,uvec4或其中的数组。
  •   

因此,请确保相应的统一变量在着色器中真正声明为vec4(可能是vec3?)。