2013-04-14 7 views
9

Czy ktoś wie, jak wykonać switchcase składnię w module cieniowania fragmentów na Samsung Galaxy S2? Pojawia się błąd kompilacji: Expected literal or '(', got 'switch'.Android OpenGL ES 2.0: Czy w gps GLSL na Samsung Galaxy S2 możliwa jest składnia "switch-case"?

Moja składnia jest następująca:

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

Działa to dobrze na Nexusa 7, ale na Galaxy S2 otrzymuję powyższy błąd. Czy na Galaxy S2 instrukcje są po prostu niemożliwe? Powodem, dla którego chcę ich użyć, wydaje się, że poprawiają wydajność w stosunku do ifelse na Nexusie 7. Jeśli nie są możliwe w Galaxy S2, czy istnieje sposób na zapytanie urządzenia i użycie switchcase, jeśli to możliwe, i ifelse inaczej?

Odpowiedz

7

switch Instrukcja nie jest obsługiwana w OpenGL ES 2.0. Z OpenGL ES Shading Language 1.0.17 specyfikacji 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 jest oparty na wersji 1.10 pulpitu GLSL, ale instrukcje "switch case" zostały dodane w wersji 1.30, więc nie można założyć, że urządzenie będzie je obsługiwać.

Polecam również unikanie rozgałęzień w shaderze fragmentów, ponieważ źle trafia w perfomanace.

+0

Jak można uniknąć rozgałęzienia, jeśli konieczne animowanie barwy poszczególnych obiektów tego modułu fragmentów i GPU nie obsługuje dostęp do tablicy o zmiennej (tylko stałe kompilacji) ? – Navigateur

+3

Możesz spróbować przygotować różne shadery dla różnych typów obiektów (bez _switch_, z kodem dla właściwego _case_ inlined) i wywoływać glUseProgram (GLint aObjectShaderID) przed rysowaniem, gdy zmiany typu. Właśnie tego teraz używam, przyspieszenie zależy od tego, jak często muszę zmieniać shadery (obiekty do narysowania powinny być sortowane przez shadery, aby zminimalizować zmiany shaderów) i jak złożone są rozgałęzienia, ale złotą zasadą jest unikanie rozgałęzień za wszelką cenę i proflie po wdrażanie każdej optymalizacji. – zombo

+0

zombo, czy to wymaga osobnego wywołania 'drawElements' na program, tak? Czy nie wiąże się to z kosztami własnymi i skąd wiadomo, że nie jest droższa niż rozgałęzienie w module cieniowania fragmentów? – Navigateur

Powiązane problemy