18

我试图在 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 以外的命令加载采样器。

他们似乎都没有解释为什么我收到这个错误。快把我逼疯了,求救!

4

1 回答 1

11

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

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

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

因此,请确保相应的统一变量确实像vec4在着色器中那样声明(也许它是一个vec3?)。

于 2013-02-07T14:33:41.807 回答