Autor Wątek: Fraktale, a android  (Przeczytany 2141 razy)

Offline PsichiX (ΨΧΞ)

  • Użytkownik
    • PsichiX Website

# Kwiecień 01, 2013, 03:29:23
witam, wpadłem na potrzebe generowania fraktali w pewnej grze i wszystko byloby wspaniale, gdyby nie to, ze glsl na androidach w wersji 2.3 (a przynajmniej moim) nie radza sobie z petlami w shaderach. czy znacie jakis sposob na generowanie fraktali, ktore nie wymagaja iteracji w petlach, zas mozliwie co najwyzej, bylyby iterowane statycznie?
za wszelka pomoc z gory ogromnie dziekuje.
pozdrawiam!

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline ismu

  • Użytkownik

# Kwiecień 01, 2013, 14:16:28
Może to co napisze jest trochę głupie i nie jestem pewny czy na androidzie takie coś zadziała na NDK. Ja kiedyś miałem też problem z wydajnością w programach rekurencyjnych (na PC, nie mogłem korzystać z GPU). Obliczenia robiłem na CPU i jak pisałem normalnie rekurencje to działało za wolno. Problem rozwiązałem statycznie generując wyniki dla danego "stopnia rekurencji" za pomocą szablonów i metaprogramowania. Działa to tak, że definiujemy sobie funkcję rekurencyjną jako szablon który przyjmuje jako parametr stopień. W miejscu wywołania funkcji np stopnia 20 podczas kompilacji generowane są statycznie wywołania i wyniki dla stopni od 1..20. Nie wiem jak z wydajnością takiego rozwiązania na androidzie i czy w ogóle da się tak zrobić. W twoim przypadku po prostu trzeba by wygenerować wszystkie stopnie fraktala jakie potrzebujesz na CPU a do shadera przekazywać już gotowe dane do wyświetlenia. Jeśli chciałbyś wziąć pod uwagę takie rozwiązanie to jestem wstanie znaleźć materiał na ten temat i podesłać ci (bodajże w któryś perełkach był rozdział o tym).
« Ostatnia zmiana: Kwiecień 01, 2013, 14:20:25 wysłana przez ismu »

Offline Xender

  • Użytkownik

# Kwiecień 01, 2013, 14:18:54
Zostaje chyba manualnie rozwinąć pętlę - jaki problem? W końcu ilość iteracji określa precyzję i jest stała w czasie kompilacji.

Offline cybek

  • Użytkownik
    • Strona domowa!

# Kwiecień 01, 2013, 15:03:01
A sprawdzałeś czy samo goto działa?

Offline koirat

  • Użytkownik

# Kwiecień 01, 2013, 15:25:16
Zacznijmy może od tego o jakich fraktalach mowa.

Offline PsichiX (ΨΧΞ)

  • Użytkownik
    • PsichiX Website

# Kwiecień 01, 2013, 15:40:12
cybek: goto w glsl 2?
koirat:  IFS - zbiory julii i mandelbrota

Offline hashedone

  • Użytkownik

# Kwiecień 01, 2013, 22:18:37
A do czego to jest potrzebne konkretnie? Bo jeśli coś w stylu:
if(cond)
  color = color1;
else
  color = color2;
to może starczy:
color = cond * color1 + cond * color2;
=== EDIT ===
Nie doczytałem że chodzi o pętle. Ale z pętlami o stałej liczbie kroków (for(int i = 0; i < n; ++i)) też sobie nie radzi?
« Ostatnia zmiana: Kwiecień 01, 2013, 22:21:55 wysłana przez hashedone »

Offline Xender

  • Użytkownik

# Kwiecień 02, 2013, 00:01:21
@up - taką pętlę można rozwinąć z palca. Problem w tym, że Manderbrelot wymaga zrobienia break, jeśli punkt ucieknie poza określony promień - "wynik" to liczba iteracji, zanim punkt ucieknie. W takim wypadku można by to rozwinąć ręcznie i bawić się w matematyczne instrukcje warunkowe, jak pokazałeś wyżej, ale pytanie, na ile będzie to wydajne?

Offline Paweł

  • Użytkownik

# Kwiecień 02, 2013, 00:06:09
Mandelbort na shadertoju: https://www.shadertoy.com/view/4df3Rn

Offline Xender

  • Użytkownik

# Kwiecień 02, 2013, 00:30:30
O, czyli z tego wychodzi, że punkt, który raz ucieknie, raczej już nie wraca (a pezynajmniej tego nie widać) - dobrze wiedzieć.

Offline Krzysiek K.

  • Moderator
    • DevKK.net

# Kwiecień 02, 2013, 01:06:42
Cytuj
@up - taką pętlę można rozwinąć z palca. Problem w tym, że Manderbrelot wymaga zrobienia break, jeśli punkt ucieknie poza określony promień - "wynik" to liczba iteracji, zanim punkt ucieknie. W takim wypadku można by to rozwinąć ręcznie i bawić się w matematyczne instrukcje warunkowe, jak pokazałeś wyżej, ale pytanie, na ile będzie to wydajne?
if( punkt jest w promieniu ) liczba_iteracji+=1.0;

Offline hashedone

  • Użytkownik

# Kwiecień 02, 2013, 15:31:20
@Xender - nie wraca, dla tego dziwiła mnie konieczność użycia pętli o zmiennej liczbie kroków. Break to jest po prostu optymalizacja w tym przypadku jeśli liczy się Mandelbrota na SISD.

Offline Xender

  • Użytkownik

# Kwiecień 02, 2013, 16:56:56
@up - Na SIMD w grafikach też, bo są duże, lokalne spójne obszary, gdzie liczba potrzebnych iteracji jest mała - o ile jest możliwość użycia break.