Staram się, aby ten moduł cieniujący działał na naprawdę starym iDevice, a także na androidach.
Nawet gdy zredukuję kod do 2 funkcji sinusoidalnych na fragment, moduł cieniujący działa z prędkością około 20 klatek na sekundę.
Zastanawiałem się nad wyciągnięciem liścia z książki o starych technikach cieniowania i stworzeniem tablicy zawierającej garść predefiniowanych wartości wyzwalania i jakimś sposobem wykorzystania ich do przybliżenia modułu cieniującego.
W shaderze, który podłączyłem powyżej, już symuluję, że poprzez zaokrąglenie wartości wysyłanych do funkcji trig dalsza lewa myszka (gdy jest w dół) idzie w kierunku gorszej jakości shadera. To jest naprawdę całkiem fajne, ponieważ bardzo blisko lewej strony wygląda jak zupełnie inny i całkiem fajny shader.
W każdym razie mam dwa dylematy:
- Nie wiem, jaki jest najbardziej efektywny sposób, aby mieć w sobie tablicę wartości 360 w module cieniującym GLSL, stałym lub jednolitym?
Nie mogę wymyślić, jak ustawić liczbę w zakresie, jak zwykle, gdybym chciał kąta od 0 do 360 (tak, wiem, że procesory graficzne używają radianów), zrobiłbym to w ten sposób.
func range(float angle) { float temp = angle while (temp > 360) {temp -= 360;} while (temp < 0) {temp += 360;} return temp; }
Jednak GLSL nie zezwala na pętle while ani funkcje rekurencyjne.
mod
funkcja jest tym, czego chcesz. Można by napisać mod(angle, 360.0)
.