我试图在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工具时得到的结果:
它返回glUniform4fv的GL_INVALID_OPERATION,注意表示的值似乎是正确的。
以下是我从documentation找到的GL_INVALID_OPERATION错误的可能原因:
他们似乎没有解释为什么我收到这个错误。它让我发疯,请帮忙!
答案 0 :(得分:9)
添加我的评论作为答案,因为它原来是解决方案:
我能想象的唯一原因是第2点和第3点:
- 着色器中声明的统一变量的大小与glUniform命令指示的大小不匹配。
- 此函数的有符号或无符号整数变体之一用于加载float,vec2,vec3,vec4或者类型的统一变量 这些的数组,或者如果是其中一个浮点变体 function用于加载int,ivec2,ivec3类型的统一变量, ivec4,unsigned int,uvec2,uvec3,uvec4或其中的数组。
因此,请确保相应的统一变量在着色器中真正声明为vec4
(可能是vec3
?)。