2013-02-05 9 views
18

I‘versuchen, ein Basisspiel in iOS und OpenGL ES zu entwickeln, aber ich bin auf diesem Problem mit den Uniformen stecken, hier ist der Code, den Wert auf meine Uniform passiert:glUniform4fv schenkt 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); 

Beachten Sie, dass darauf geachtet wurde, die Funktion glUniform mit glUseProgram und vor dem Aufruf von glDrawArrays zu positionieren. Die einheitlichen Standorte sehen auch gut aus, was durch die Rückverfolgung bestätigt wird. Hier ist, was ich bekomme, wenn ich die OpenGL ES Analyzer Tool in XCode laufen:

enter image description here

Es gibt einen GL_INVALID_OPERATION für glUniform4fv, feststellen, dass die dargestellten Werte scheinen richtig zu sein.

Hier sind die möglichen Ursachen für die GL_INVALID_OPERATION Fehler, den ich aus den documentation gefunden:

  • gibt es kein aktuelles Programmobjekt.
  • Die Größe der im Shader deklarierten Uniform-Variablen stimmt nicht mit der vom Befehl glUniform angegebenen Größe überein.
  • Eine der vorzeichenbehafteten oder vorzeichenlosen Integer-Varianten dieser Funktion wird verwendet, um eine uniforme Variable vom Typ float, vec2, vec3, vec4 oder ein Array davon zu laden, oder wenn eine der Gleitkommavarianten dieser Funktion ist verwendet, um eine einheitliche Variable vom Typ int, ivec2, ilec3, ivec4, unsigned int, uvec2, uvec3, uvec4 oder ein Array davon zu laden.
  • Eine der vorzeichenbehafteten ganzzahligen Varianten dieser Funktion wird verwendet, um eine einheitliche Variable vom Typ unsigned int, uvec2, uvec3, uvec4 oder ein Array davon zu laden.
  • Eine der vorzeichenlosen Integer-Varianten dieser Funktion wird verwendet, um eine einheitliche Variable vom Typ int, ivec2, ivec3, ivec4 oder ein Array davon zu laden.
  • Der Speicherort ist ein ungültiger einheitlicher Speicherort für das aktuelle Programmobjekt und die Position ist nicht gleich -1.
  • count ist größer als 1 und die angezeigte uniforme Variable ist keine Array-Variable.
  • Ein Sampler wird mit einem anderen Befehl als glUniform1i und glUniform1iv geladen.

Keiner von ihnen scheint zu erklären, warum zum Teufel ich diesen Fehler erhalte. Es macht mich verrückt, bitte hilf!

+2

Die einzigen Ursachen aus der Liste, die ich mir vorstellen kann, sind die Punkte 2 und 3. Also wird die entsprechende Uniform-Variable im Shader wirklich als 'vec4' deklariert (vielleicht ist es' vec3')? Ansonsten +1 für die ausführliche Analyse (obwohl der Shader-Code auch schön gewesen wäre). –

+0

Sie haben den Punkt! Ich habe die einheitliche Dimension nach Änderungen übersehen, die ich vor einiger Zeit gemacht habe, ich hatte uniform vec3 ucenterp für meinen centerPosition-Wert, nachdem ich ihn in vec4 geändert habe, ist der Fehler für immer verschwunden :) Vielen Dank für Ihre Hilfe. Prost – Pupillam

+0

@ChristianRau Ich denke, er möchte, dass Sie Ihren Kommentar als Antwort hinzufügen;) –

Antwort

9

Hinzufügen meines Kommentars als Antwort, da es stellte sich heraus, die Lösung zu sein:

Die einzigen Ursachen von dieser Liste, die ich sind die Punkte 2 und 3 vorstellen konnte:

  • die Größe Die im Shader deklarierte Uniform-Variable stimmt nicht mit der vom Befehl glUniform angegebenen Größe überein.
  • Eine der vorzeichenbehafteten oder vorzeichenlosen Integer-Varianten dieser Funktion wird verwendet, um eine einheitliche Variable vom Typ float, vec2, vec3, vec4 oder ein Array davon zu laden, oder wenn eine der Gleitkomma-Varianten dieser Funktion wird verwendet, um eine einheitliche Variable vom Typ int, IVEC2, IVEC3, IVEC4, unsigned int, uvec2, uvec3, uvec4 oder ein Array von diesen zu laden.

So stellen Sie sicher, dass das entsprechende Uniform-Variable wirklich als vec4 im Shader deklariert wird (vielleicht ist es ein vec3?).

Verwandte Themen