glUniform4fv给出了GL_INVALID_OPERATION

Pup*_*lam 18 iphone shader opengl-es ios

我试图在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);
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

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

以下是我从文档中找到的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之外的命令加载采样器.

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

Chr*_*ica 9

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

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

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

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