2013-04-14 15 views
9

Qualcuno sa come fare la sintassi switchcase nello shader di frammenti sul Samsung Galaxy S2? Ottengo l'errore di compilazione: Expected literal or '(', got 'switch'.Android OpenGL ES 2.0: la sintassi "switch-case" è possibile nello shader del frammento GLSL su Samsung Galaxy S2?

mia sintassi è la seguente:

switch(i){ 
    case 0: x = alphas[0]; break; 
    case 1: //...etc. 
} 

Questo funziona bene sul Nexus 7, ma sul Galaxy S2 ottengo l'errore precedente. Le istruzioni switchcase sono semplicemente impossibili sul Galaxy S2? Il motivo per cui voglio usarli è che danno un miglioramento delle prestazioni rispetto a ifelse sul Nexus 7. Se sono impossibili sul Galaxy S2, c'è un modo per interrogare il dispositivo e usare switchcase se disponibile, e ifelse altrimenti?

risposta

7

L'istruzione switch non è supportata in OpenGL ES 2.0. Dal OpenGL ES Shading Language 1.0.17 spec 3.7:

The following are the keywords reserved for future use. Using them will result in an error:

asm class union enum typedef template this packed goto switch default ...

4

GLSL ES è basato sulla versione 1.10 del desktop GLSL, ma le istruzioni "switch case" sono state aggiunte nella versione 1.30, quindi non è possibile presumere che il dispositivo lo supporterà.

Inoltre, consiglierei di evitare la ramificazione nello shader di frammenti in quanto colpisce male il perfomanace.

+0

Come è possibile evitare ramificazione se devo animare i colori di oggetti separati nello shader frammento e la GPU non supporta l'accesso array variabile (solo costanti in fase di compilazione) ? – Navigateur

+3

È possibile provare a preparare diversi shader per diversi tipi di oggetto (senza _switch_, con codice per _case_ appropriato allineato) e chiamare glUseProgram (GLint aObjectShaderID) prima del disegno, quando il tipo cambia. Questo è quello che uso in questo momento, l'accelerazione dipende da quanto spesso devo cambiare shader (gli oggetti da disegnare dovrebbero essere ordinati dagli shader per minimizzare i cambiamenti degli shader) e quanto è complessa la ramificazione, ma la regola d'oro è di evitare la ramificazione a tutti i costi e profi implementando ogni ottimizzazione. – zombo

+0

zombo, questo richiede una chiamata 'drawElements' separata per programma, sì? Questo non ha i suoi costi e come fai a sapere che non è più costoso della ramificazione nello shader di frammenti? – Navigateur