GLSL: Jak rzutować zmiennoprzecinkowe na int?

40

W shaderze fragmentów GLSL próbuję wrzucić floatdo pliku int. Kompilator zgłasza błąd:

ERROR: 0:60: '=' :  cannot convert from 'mediump float' to 'highp int'

Próbowałem podnieść precyzję int:

mediump float indexf = floor(2.0 * mixer);
highp int index = indexf;

ale bez skutku.

Jak intpoprawnie rzucić ?

dugla
źródło
1
W przyszłości znajdziesz lepsze odpowiedzi, jeśli zadasz ogólne pytania dotyczące programowania, takie jak to w Stack Overflow. stackoverflow.com - w zależności od opinii społeczności to pytanie może zostać przeniesione.
Ricket
W przypadku reinterpretacji rzutów istnieją teraz takie funkcje, jak floatBitsToInt.
jozxyqk

Odpowiedzi:

41

Spróbuj tego:

highp int index = int(indexf);

Znalazłem to tutaj .

Ricket
źródło
Zauważ również, że rzutowanie float na int automatycznie powoduje jego podłogę (przynajmniej w dowolnej implementacji, jaką kiedykolwiek widziałem), więc twoje wywołanie floor powinno być niepotrzebne.
Ricket
6
W większości języków tryb zaokrąglania jest skracany / zaokrąglany do zera, co jest równoważne wartości minimalnej dla liczb dodatnich, ale nie liczb ujemnych. Nie pamiętam, czy dotyczy to GLSL, ale byłbym zaskoczony, gdyby tak nie było.
@Joe To interesujący fakt, o którym nigdy nie myślałem, a właśnie to potwierdziłem testem Java.
Ricket
4
Czy highp jest tutaj ważny? (On a Integer)
Léon Pelletier
Dzięki, działało to również w moim przypadku. Czy możesz zaktualizować wprowadzone przez siebie odniesienie, ponieważ strona nie istnieje?
Bora,