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ć ?


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 .


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,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.