我试图在 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);
请注意,在 glUseProgram 之前和 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 是当前程序对象的无效统一位置,并且 location 不等于 -1。
- count 大于 1 并且指示的统一变量不是数组变量。
- 使用 glUniform1i 和 glUniform1iv 以外的命令加载采样器。
他们似乎都没有解释为什么我收到这个错误。快把我逼疯了,求救!