2012-07-08 5 views
6

Sto sviluppando un'applicazione OpenGL per iPhone. Nel mio vertex shader, ho bisogno di un modo per cambiare il colore di un gran numero di (ma non di tutti) dei miei vertici, allo stesso tempo, così ho optato per l'indicizzazione dei colori. Ciò mi consentirà di lasciare il VBO statico e di modificare una singola variabile uniforme piuttosto che passare da un vertice all'altro e modificare le informazioni sul colore tra ciascun fotogramma.Fornire un numero intero per un indice di array in OpenGL ES 2.0?

Il mio piano è quello di creare una uniforme con una matrice di colori, aggiungere un numero intero contenente un indice negli attributi. Qui è la mia vertex shader:

uniform mat4 u_mvp_matrix; 
uniform vec4 u_color_array[]; 

attribute vec4 a_position; 
attribute int a_colorIndex; 

varying lowp vec4 v_color; 

void main() 
{ 
    v_color = u_color_array[a_colorIndex]; 

    gl_Position = u_mvp_matrix * a_position; 
} 

Questo genera un errore:

int can't be an in in the vertex shader

ho fatto qualche ricerca. L'iPhone supporta OpenGL ES 2.0 al più tardi, il che significa che supporta GLSL 1.2 al più tardi e apparentemente gli interi sono supportati solo in GLSL 1.3 e versioni successive. Ho provato a cambiare a_colorIndex in un float. Non mi aspettavo che funzionasse, e non lo fece.

Come è possibile specificare un indice di colore per ogni vertice?

+0

Forse prendere in considerazione una ricerca della trama, in cui l'indice è un flo virante, anziché una ricerca di matrice? O puoi lanciare/arrotondare il float a un int? – Tim

+1

"che significa che supporta GLSL 1.2 al più tardi" No non è così. GL ES 2.0 significa che supporta il linguaggio di shading GLSL *** ES ***, che è * diverso * dal linguaggio GLSL desktop. GLSL ES è basato su GLSL 1.2, ma non sono * la stessa cosa. * –

risposta

4

Specificare l'attributo come float. Puoi usare i float come indici negli array.

+0

Ottengo questo errore "L'espressione indice ha tipo 'float' ma dovrebbe avere tipo integrale" se faccio ciò che hai detto. È sicuro fare array [int (fIndex)] o si imbatterà in errori di precisione? – weezor

+0

Ho riscontrato lo stesso problema di weezor ("... dovrebbe avere un tipo integrale") (almeno in alcuni casi). Sarebbe bello chiarire. –

+0

La specifica del linguaggio ES2 dice: "Si accede agli elementi dell'array usando un'espressione il cui tipo è un numero intero." Quindi sì, lanciare su int (le piattaforme di tipo lenitivo eseguono un cast implicito, quindi la risposta probabilmente funziona sulla macchina del rispondente). – kiwibonga