2013-02-05 10 views
18

I' cercando di sviluppare un gioco di base in iOS e OpenGL ES, ma mi sono bloccato su questo problema con le divise, qui è il codice che passa il valore alla mia uniforme:glUniform4fv sta dando 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); 

Si noti che è stata prestata attenzione a posizionare la funzione glUniform preceduta da glUseProgram e prima che venga effettuata la chiamata glDrawArrays. Le posizioni uniformi sembrano buone anche se confermate tramite traccia. Ecco che cosa ottengo quando faccio funzionare lo strumento OpenGL ES Analyzer in XCode:

enter image description here

restituisce un GL_INVALID_OPERATION per glUniform4fv, noto che i valori rappresentati sembrano essere corrette.

Ecco le possibili cause per l'errore che ho trovato GL_INVALID_OPERATION dal documentation:

  • non c'è alcun oggetto programma in corso.
  • la dimensione della variabile uniforme dichiarata nello shader non corrisponde alla dimensione indicata dal comando glUniform.
  • una delle varianti integer con segno o senza segno di questa funzione viene utilizzata per caricare una variabile uniforme di tipo float, vec2, vec3, vec4 o una matrice di questi o se una delle varianti in virgola mobile di questa funzione è utilizzato per caricare una variabile uniforme di tipo int, ivec2, ivec3, ivec4, unsigned int, uvec2, uvec3, uvec4 o una matrice di questi.
  • una delle varianti di interi con segno di questa funzione viene utilizzata per caricare una variabile uniforme di tipo unsigned int, uvec2, uvec3, uvec4 o un array di questi.
  • una delle varianti intere senza segno di questa funzione viene utilizzata per caricare una variabile uniforme di tipo int, ivec2, ivec3, ivec4 o una matrice di questi.
  • posizione è un percorso uniforme non valido per l'oggetto programma corrente e la posizione non è uguale a -1.
  • il conteggio è maggiore di 1 e la variabile uniforme indicata non è una variabile di matrice.
  • un campionatore viene caricato utilizzando un comando diverso da glUniform1i e glUniform1iv.

Nessuno di loro sembra spiegare perché diavolo sto ricevendo questo errore. Mi sta facendo impazzire, per favore aiuto!

+2

Le uniche cause dall'elenco che potrei immaginare sono i punti 2 e 3. Quindi la variabile uniforme corrispondente dichiarata realmente come 'vec4' nello shader (forse è' vec3')? Altrimenti +1 per l'analisi approfondita (sebbene, anche il codice dello shader sarebbe stato bello). –

+0

Hai capito? Ho trascurato la dimensione uniforme dopo le modifiche apportate qualche tempo fa, avevo uniforme vec3 ucenterp per il mio valore centerPosition, dopo averlo modificato in vec4 l'errore è andato per sempre :) Grazie mille per l'aiuto. Cheers – Pupillam

+0

@ChristianRau Penso che voglia che tu aggiunga il tuo commento come risposta;) –

risposta

9

Aggiungendo il mio commento come risposta, dal momento che si è rivelata la soluzione:

le uniche cause di quella lista che ho potuto immaginare sono i punti 2 e 3:

  • la dimensione della variabile uniforme dichiarata nello shader non corrisponde alla dimensione indicata dal comando glUniform.
  • una delle varianti integer con segno o senza segno di questa funzione viene utilizzata per caricare una variabile uniforme di tipo float, vec2, vec3, vec4 o una serie di questi o se una delle varianti in virgola mobile di questo la funzione viene utilizzata per caricare una variabile uniforme di tipo int, ivec2, ivec3, ivec4, unsigned int, uvec2, uvec3, uvec4 o una matrice di questi.

in modo da assicurarsi che la variabile uniforme corrispondente è davvero dichiarato come vec4 nello shader (forse è una vec3?).