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.
źródło
mod
funkcja jest tym, czego chcesz. Można by napisaćmod(angle, 360.0)
.Odpowiedzi:
GL_REPEAT
jako trybu zawijania dla tekstury, a zacznie się ona automatycznie od początku, gdy uzyskasz dostęp z argumentami> 1 (i podobnie w przypadku argumentów negatywnych).GL_LINEAR
jako filtru tekstur, w ten sposób uzyskując wartości, których nawet nie zapisałeś. Oczywiście interpolacja liniowa nie jest w 100% dokładna dla funkcji trygonometrycznych, ale z pewnością jest lepsza niż brak interpolacji.float sin = 2.0 * (texValue.r + texValue.g / 256.0) - 1.0;
(lub nawet więcej składników dla drobniejszego ziarna). Pozwala to ponownie skorzystać z tekstur wieloskładnikowych.Oczywiście należy jeszcze ocenić, czy jest to lepsze rozwiązanie, ponieważ dostęp do tekstur również nie jest całkowicie bezpłatny, a także jaka byłaby najlepsza kombinacja rozmiaru i formatu tekstury.
Jeśli chodzi o wypełnianie tekstury danymi i adresowanie jednego z twoich komentarzy, musisz wziąć pod uwagę, że filtrowanie tekstur zwraca dokładną wartość w środku teksla , tj. Współrzędną tekstury o połowę mniejszą niż rozmiar teksla. Więc tak, powinieneś generować wartości w
.5
tekstach , tj. Coś takiego w kodzie aplikacji:uniform float sinTable[361]
glUniform1fv
mod
źródło