2013-02-05 63 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?)。

相關問題