Dlaczego funkcje arytmetyczne GLSL dają tak różne wyniki na iPadzie niż na symulatorze?
Aktualnie ścigam niektóre błędy w moim kodzie shaderów fragmentu OpenGL ES 2.0, który działa na urządzeniach z systemem iOS. Kod działa dobrze w symulatorze, ale na iPadzie ma ogromne problemy, a niektóre obliczenia dają bardzo różne wyniki, miałem na przykład0.0
na iPadzie i4013.17
na symulatorze, więc nie mówię o małych różnicach, które mogą być wynikiem błędów zaokrąglania.
Jedną z rzeczy, które zauważyłem, jest to, że na iPadzie
float1 = pow(float2, 2.0);
może dać wyniki, które bardzo różnią się od wyników
float1 = float2 * float2;
W szczególności podczas używaniapow(x, 2.0)
na zmiennej zawierającej większą liczbę ujemną jak-8
, wydawało się, że zwraca wartość, która spełniła warunekif (powResult <= 0.0)
.
Również wynik obu operacji (pow(x, 2.0)
jak równieżx*x
) daje różne wyniki w symulatorze niż na iPadzie.
Używane pływaki sąmediump
, ale dostaję te same rzeczyhighp
.
Czy istnieje proste wyjaśnienie tych różnic?
Zawężam problem, ale zajmuje to dużo czasu, więc może ktoś może mi pomóc tutaj z prostym wyjaśnieniem.