2013-02-05 48 views
18

我”尝试开发iOS和OpenGL ES的一个基本的游戏,但我被困在这个问题上与制服,这里是该值传递给我的制服代码:glUniform4fv是给GL_INVALID_OPERATION

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

请注意,在调用glDrawArrays之前,已经注意将glUniform函数放在glUseProgram之前。统一的位置看起来也很好,通过跟踪确认。这里是我所得到的,当我在XCode中运行的OpenGL ES分析工具:

enter image description here

它返回一个glUniform4fv GL_INVALID_OPERATION,注意代表的价值观似乎是正确的。

下面是对GL_INVALID_OPERATION错误我从documentation发现可能的原因:

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

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

+2

从列表中我可以想到的唯一原因是第2和第3点。所以在着色器中真正声明为'vec4'的对应统一变量(可能是'vec3')?否则,+1用于广泛分析(尽管如此,着色器代码也会很好)。 –

+0

你明白了!我在前一段时间修改之后忽略了统一维度,在我将centerPosition值更改为vec4后,我的统一vec3 ucenterp被修改为vec4后,错误消失了:)非常感谢您的帮助。干杯 – Pupillam

+0

@ChristianRau我认为他希望你添加你的评论作为答案;) – 2013-02-07 14:30:07

回答

9

添加我的评论作为一个答案,因为它竟然是解决方案:

从该列表中,我能想象的唯一原因是点2和3:

  • 大小在着色器中声明的统一变量的大小与glUniform命令指定的大小不匹配。
  • 此功能的符号或无符号整数的变体
  • 一个用于加载型浮子,VEC2,VEC3,vec4或 阵列的这些的均匀变量,或者如果此 的浮点变体之一函数用于加载类型为int,ivec2,ivec3, ivec4,unsigned int,uvec2,uvec3,uvec4或其数组的一个统一变量。

所以要确保相应的匀变速真的宣布着色器中vec4(也许这是一个vec3?)。

相关问题