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:
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!
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). –
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
@ChristianRau Ich denke, er möchte, dass Sie Ihren Kommentar als Antwort hinzufügen;) –