Skocz do zawartości

Wielkość blura w gotowym shaderze.


gnysek

Rekomendowane odpowiedzi

  • Administratorzy

Joł miśki. Z shaderów jestem niestety słaby jak mięśnie Najmana... znalazłem sobie shader na blura, jest fajny, ale chciałbym móc mu przekazywać jak mocny na być ten blur. Próbowałem przez shader_set_uniform, ale po wielu próbach wyszło mi na to, że ponieważ jest tam pętla for, to w trakcie kompilacji to jest konwertowane na normalne polecenia na podstawie liczby w pętli i jeśli podam własną zmienną, to się gra nie kompiluje...

 

Vertex

attribute vec3 in_Position;                  // (x,y,z)
attribute vec4 in_Colour;                    // (r,g,b,a)
attribute vec2 in_TextureCoord;              // (u,v)
//attribute vec3 in_Normal;                  // (x,y,z)     unused in this shader.

varying vec2 v_vTexcoord;
varying vec4 v_vColour;

void main()
{
    vec4 object_space_pos = vec4( in_Position.x, in_Position.y, in_Position.z, 1.0);
    gl_Position = gm_Matrices[MATRIX_WORLD_VIEW_PROJECTION] * object_space_pos;
    
    v_vColour = in_Colour;
    v_vTexcoord = in_TextureCoord;
}

 

Fragment

varying vec2 v_vTexcoord;
varying vec4 v_vColour;


//uniform int  u_iSize;       // Filter size
uniform vec2 u_vTexelSize;

void main()
{
    gl_FragColor = vec4(0.0,0.0,0.0,1.0);
    int size = 9;          // Square filter size. Must be >=3 and uneven to work.
    int elems = size*size;
    size /= 2;
    for(int i = -size;i <= size;i++) {
        for(int j = -size;j <= size;j++) {
            vec2 offset = vec2(float(i)*u_vTexelSize.x,float(j)*u_vTexelSize.y);
            gl_FragColor += v_vColour * texture2D( gm_BaseTexture, v_vTexcoord + offset);
        }
    }
    gl_FragColor.rgba /= float(elems);

 

Więc jeśli zamiast int size = 9; zrobiłem u_iSize, to niestety się kompilator wywala.

Ktoś ma pomysł? Ten blur całkiem zacnie wygląda, ale chciałbym go płynnie zwiększać bez rysowania surface na surface i alpha blendingu, zresztą wtedy widać że blur nie rośnie a jest druga warstwa.

Odnośnik do komentarza
Udostępnij na innych stronach

rozmiar blura zmieniaj poprzez skalowanie offsetow sampli, nie zas sama iloscia sampli - dla Twojego gpu to bedzie bardziej strawna wersja niz dynamiczna zmiana ilosci sampli.

Odnośnik do komentarza
Udostępnij na innych stronach

druga sprawa: poprawnie dobrej jakosci blur robi sie dwoma przebiegami:

1. render sceny do pierwszej tekstury;

2. render pierwszej tekstury do drugiej z shaderem blura wertykalnego;

3. render drugiej tekstury na ekran z shaderem blura horyzontalnego;

voila! cieszysz sie najlepszej jakosci blurem :)

 

@MaxGaming: glupi jestes i nic juz tego nie zmieni D:

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Psyś, to wiem, w twoim blurze tak jest, w sieci też takowe widziałem, ale ponieważ chcę działać na application_surface w GM, to trochę nieoptymalnym może być lecieć dwa razy po nim i nie wiem czy renderowanie w siebie samego albo kopiowanie na drugi surface nie będzie zabójcze dla pamięci na Androidzie. A chcę jak najtaniej uzyskać efekt takiego stopniowego rozmycia ekranu (chodzi o to, że jak robisz pauzę, to tło się rozmywa).

Odnośnik do komentarza
Udostępnij na innych stronach

rozmyte tło pauzy, tj. nic sie nie rusza, ale sam ekran gry pod UI pauzy jest zblurowany - to sie robi wtedy tak, ze przy wlaczeniu menu pauzy wykonujesz kroki 1 i 2, zaś 3 wygląda tak, że renderujesz drugą teksturę do pierwszej z shaderem blura horyzontalnego i potem te pierwsza teksture malujesz pod UI. jesli powiesz mi ze chcesz renderowac to realtime tylko po to, by wykorzystac application_surface, to wybacz, ale wtedy parskne smiechem :P

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Wybacz, że jesteś najmądrzejszy na świecie i nic nie rozumiem z tego co mówisz. Zwłaszcza, że próbuję ominąć problem używania drugiego surface oraz tworzenia nowego sprite dynamicznie, stąd powyższy kod na blura (notabene wyglądającego lepiej niż ten w Twoich przykładach, bo nie ma takich kwadracików).

Odnośnik do komentarza
Udostępnij na innych stronach

sarkazm jest zbędny. kwadraciki w moim blurze są jedynie przez ustalenie skali na > 1. serio, to co chcesz zrobić nie potrzebuje application_surface, ale jak sie upierasz to zrób tak jak na początku napisałem: zamiast zmieniać size na uniforma, dodaj jedynie uniforma skali i mnóż go przez offset, a size zostaw nietknięty, lub zwiększ jego ilość - na mobilach dynamiczne loopy i ify nie zadziałają wszędzie.

Odnośnik do komentarza
Udostępnij na innych stronach

  • 2 tygodnie później...

Bo nie musi do Ciebie przemawiać, żeby działał :P zrobić to z głową i załatwione.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Ale np. próbowałem te float(j) i float(i) przemnażać przez liczbę którego podaję do shadera (np. 0 - 1, uniform to jest tak?) i nic nie dało. A tego o czym wspomniałem powyżej po prostu nie zrozumiałem, bo nie wiem co to xD

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...