Skocz do zawartości

[GM:S] Polish Shader Library


Rekomendowane odpowiedzi

No właśnie się domyśliłem że jakieś maski będą potrzebne bo jak bym zrobił tak jak ja chciałem to by cały prostokątny obszar nad obiektami się modyfikował.

 

BTW jak by ktoś chciał to na fullscreenie a nie spricie to

Trzeba włączyć sobie 2 viewy w opcjach room editora. I w jakimś obiekcie z najmniejszym depth:

GML (create)
globalvar gSurfaceHaze;

gSurfaceHaze = surface_create( view_wview, view_hview );

view_surface_id[0] = gSurfaceHaze;

GML (draw)
if ( !surface_exists(gSurfaceHaze) )

{

gSurfaceHaze = surface_create(view_wview, view_hview);

view_surface_id[0] = gSurfaceHaze;

}

else

{

if ( view_current == 1 )

{

uPhase = shader_get_uniform(sh_HeatHaze, "uPhase");

shader_set(sh_HeatHaze);

shader_set_uniform_f(uPhase, 1.5 / view_wview, 0.5 / view_hview, current_time * 0.01, 20);

draw_surface(gSurfaceHaze, 0, 0);

shader_reset();

}

}

HeatHaze.gmz

 

Są jeszcze jakieś sposoby z 1 viewem na Draw i Draw GUI ale tego nie wiem jak zrobić.

Odnośnik do komentarza
Udostępnij na innych stronach

  • 1 miesiąc temu...
  • Odpowiedzi 137
  • Dodano
  • Ostatniej odpowiedzi

Top użytkownicy w tym temacie

Top użytkownicy w tym temacie

Z racji, że dziś w końcu mogłem siąść do kodowania shaderków na żywym organiźmie GM:S, oto wrzucam przeportowane dwa efekty:

https://dl.dropboxusercontent.com/u/9759049/HeatHaze.gmz

https://dl.dropboxusercontent.com/u/9759049/Outline.gmz (wersja prostrza i gorszej jakości, będę dodawał w przyszłości bardziej dokładną metodę outline'u)

a zaraz zabieram się za wodę :)

Odnośnik do komentarza
Udostępnij na innych stronach

gdzie moge go znalezc? sprawdze ten kolor wtedy

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

vertex:

//
// Simple passthrough vertex shader
//
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;
varying vec2 v_vTexturePixelSize;

uniform vec2 v_TexturePixelSize;

vec2 ExtractCorner(vec4 _colour )
{
   float b = floor(_colour.b*255.0); //get whole number, (int)
   b = b - ((floor(b/2.0))*2.0);
   float r = floor(_colour.r*255.0); //get whole number, (int)
   r = r - ((floor(r/2.0))*2.0);
   float corner = (r*2.0) + b;       // Now have a 0,1,2 or 3 for the corner we're in. (topleft, clockwise)

   // Top left?
   if( corner==0.0 ){
       return vec2(-1,-1);
   } // Top Right?
   else if( corner==1.0 ){
       return vec2(1,-1);
   } // Bottom Right?
   else if( corner==2.0 ){
       return vec2(1,1);
   } // Bottom Left?
   else{
       return vec2(-1,1);
   }
}

void main()
{
   float scaler = 2.0;
   vec4 object_space_pos = vec4( in_Position.x, in_Position.y, in_Position.z, 1.0);

   // get a vector based on which corner the vertex is, and move the corner out by a SCALER amoiunt.
   vec2 corner = ExtractCorner(in_Colour);
   object_space_pos.xy = object_space_pos.xy + (corner*scaler);

   // Then transform as normal.
   gl_Position = gm_Matrices[MATRIX_WORLD_VIEW_PROJECTION] * object_space_pos;


   v_vColour = in_Colour;
   v_vTexcoord = in_TextureCoord + (corner*v_TexturePixelSize*scaler);
   v_vTexturePixelSize = v_TexturePixelSize;
}

 

fragment

 

//
// lerp to colour fragment shader
//
varying vec2 v_vTexturePixelSize;
varying vec2 v_vTexcoord;
varying vec4 v_vColour;

void main()
{
   vec2 uv = v_vTexcoord;
   vec2 uv_offset = v_vTexturePixelSize; //*2.0;
   vec2 offset1 =  uv_offset;
   vec2 offset2 =  uv_offset;
   vec2 offset3 =  uv_offset;
   vec2 offset4 =  uv_offset;

   offset1.y=0.0;
   offset1.x=-offset1.x;
   offset2.y=0.0;
   offset3.x=0.0;
   offset4.x=0.0;
   offset4.y=-offset3.y;


   vec4 col0 = texture2D( gm_BaseTexture, uv);
   vec4 col1 = texture2D( gm_BaseTexture, uv+offset1);
   vec4 col2 = texture2D( gm_BaseTexture, uv+offset2);
   vec4 col3 = texture2D( gm_BaseTexture, uv+offset3);
   vec4 col4 = texture2D( gm_BaseTexture, uv+offset4);
   col0.rgb = col0.rgb*col0.aaa;
   col0.a = max(col0.a,max(col1.a,max(col2.a,max(col3.a,col4.a))));
   gl_FragColor = v_vColour * col0;
}

 

GML
//create

Vtex_pixel_size = shader_get_uniform(sShaderDemo7, "v_TexturePixelSize");

 

//draw

shader_set(sShaderDemo7);

shader_enable_corner_id(true);

var texture = sprite_get_texture(sprite_index, image_index);

var texel_width = texture_get_texel_width(texture);

var texel_height = texture_get_texel_height(texture);

 

shader_set_uniform_f(Vtex_pixel_size, texel_width, texel_height );

image_blend=c_yellow;

draw_self();

 

shader_reset();

Odnośnik do komentarza
Udostępnij na innych stronach

dzięki, obczaje to potem i podeślę wersję ze zmianą koloru :)

swoją drogą, nikt im chyba jeszcze nie powiedział, żeby unikać IFów zwłaszcza na mobilach.

Saus: do wieczora wrzuce wersje z komentarzami i opisem.

Odnośnik do komentarza
Udostępnij na innych stronach

gnysek: fajnie, to wiem. a nawet wiem, jak zrobić ten cały durny ExtractCorners() jedną linijką kodu, bez jakiegokolwiek ifa i equalsa - będzie w kolejnym przykładzie shadera z multi teksturingiem i normalmapami, który właśnie robie :)

Odnośnik do komentarza
Udostępnij na innych stronach

ALT: No stres, to sie opisze, ale z racji, ze to dosc duzy temat, to nie zrobie tego ad hoc ;)

 

Oto nowy shader, tym razem z opisem (opisy dodam także do tych poprzednich później).

Normal Mapping: https://dl.dropboxusercontent.com/u/9759049...rmalMapping.gmz

Odnośnik do komentarza
Udostępnij na innych stronach

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Ha, thermal vision to chciałem akurat bardzo :D Miałem plan zrobić taki a'la Metal Gear Solid, skradankę top-down, jak skończę Almorę i dać tam termo google.

 

Btw. co do postu Mike'a to wiem, ze to wiesz, ale napisałeś, ze moze oni nie wiedzą, więc podałem linka który to neguje :P

 

Czekam na ten outline gdzie mozna ustawiac sobie kolory, chciałbym w Almorze móc dookoła przeciwników robic linie jak sie ich najezdza myszką a nie chce robic 2x tyle grafik do tego ;)

Odnośnik do komentarza
Udostępnij na innych stronach

ten thermal vision co dalem, to jest prosta wersja, ktora konwertuje bazowa teksture do odcieni szarosci i to w gradient zamienia, a bardziej dokladna wersja powinna polegac na podaniu osobnej tekstury czarno-bialej, na ktorej bialym beda zaznaczone miejsca cieple, a czarne to zimne i te teksture dalej powinien przetwarzac. najprosciej da sie to przerobic tak, ze robi sie osobny obiekt z tym sprajtem czarno-bialym, ale to generuje duzo problemow i zawsze to osobny obiekt. najlepiej przerobic to tak, ze oda sie kolejny sampler do shadera, przekaze jego UV i UV tekstury bazowej i samplowanie zamiast z bazowej, to z czarno-bialej. nagmatwalem, cholerka. skoncze wode to moge uzupelnic przyklad thermal vision o druga zaawansowana wersje :)

Odnośnik do komentarza
Udostępnij na innych stronach

Dodano nowy przykład - Woda.

Water

psl_water.PNG

Odnośnik do komentarza
Udostępnij na innych stronach

bedzie to niewydajne na chwile obecna, bo gm nie obsluguje wymaganego formatu tekstur, wiec trzeba bedzie to zrobic na okolo, a to wladnie bedzie overkill dla gma :<

Odnośnik do komentarza
Udostępnij na innych stronach

git, pokombinuje z animacją samych normalnych - dzięki za info! :)

Odnośnik do komentarza
Udostępnij na innych stronach

probowalem zmodyfikowac animacje w shaderze wody, ale bugi kompilatora mnie blokuja. zajme sie teraz blurami i bloomem.

Odnośnik do komentarza
Udostępnij na innych stronach

To może jakbyś zrobił coś w stylu nextgenowego ubershadera, wiesz, taki pipeline, wliczając w to powyższe blury (dwuwymiarowy + radial, w zależności od inputa poruszania kamery, zoom in/out), tone mapping, vignette, bloomy/hdr-y, noise-y, flary anamorficzne plus tego typu wkurzające migawki, aberrację chromatyczną, i na sam koniec wyostrzanie krawędzi - gdzie w każdym z wymienionych przypadków można sobie włączać/wyłączać to flagami (choć nie wiem czy są obsługiwane przez studio, jeśli nie, sprostujcie mnie proszę). Gdzieś nawet czytałem o jakimś eksperymentalnym AO 2d, i efekt tego był całkiem fajny.

 

Jeśli przy włączonych wszystkich powyższych efektach wyglądało by to mniej więcej tak:

White1.jpg

To znaczy że idzie to w dobrym kierunku. :)

Odnośnik do komentarza
Udostępnij na innych stronach

w tym wlasnie problem, ze na windzie GM:S uzywa HLSL z trybem pixel shading 2, ktory ma max 64 instrukcje arytmetyczne na fragment shader i juz sam shader wody wykorzystuje znaczna czesc. jesli zrobic ubershader wszystkich, lub choc kilku, to instrukcji moze byc za duzo D: pobawie sie z upakowaniem mozliwie kilku post-procesow w jednym ubershaderze.

a flag GM:S nie obsluguje.

Odnośnik do komentarza
Udostępnij na innych stronach

Dodano 2 nowe shadery:

 

Bloom

psl_bloom.PNG

 

Blur

psl_blur.PNG

Odnośnik do komentarza
Udostępnij na innych stronach

Ten limit instrukcji nie jest aż tak ogromnym ograniczeniem. Wszystko da się zrobić. Na przykład coś w stylu Post Process Chain-a. Po prostu zrobić surface z dodatkowym buforem, renderować scenę do jednego, odpalać shader i rysować nim do drugiego buforu, potem z buforu do sceny przełączając na inny shader do pierwszego, i tak dalej, analogicznie kontynuując.

Ba, nawet jedną z plusów tej metody jest możliwość zmiany tego chain-a w locie (wyłączać/włączać wybrane efekty). Normalnie to trzeba by było kompilować tego ubershadera za każdym razem od nowa.

Odnośnik do komentarza
Udostępnij na innych stronach

te metode zastosowalem w shaderach Blura i Blooma, ale to nie jest wtedy ubershader, a limitem jest to, ze w wersji FREE GM:S dostepne sa tylko 2 shadery.

Gnysek: jak skoncze example zbiorczych efektow, to zerkne na to demo outline'a, bo probowalem z kodem z postu i cos mi nie gralo.

Odnośnik do komentarza
Udostępnij na innych stronach

w tym wlasnie problem, ze na windzie GM:S uzywa HLSL z trybem pixel shading 2, ktory ma max 64 instrukcje arytmetyczne na fragment shader i juz sam shader wody wykorzystuje znaczna czesc. jesli zrobic ubershader wszystkich, lub choc kilku, to instrukcji moze byc za duzo D: pobawie sie z upakowaniem mozliwie kilku post-procesow w jednym ubershaderze.

a flag GM:S nie obsluguje.

 

Powiedz mi, czym się różnią te oznaczenia shaderach:

GLSL ES

GLSL

HLSL9

HLSL11

Odnośnik do komentarza
Udostępnij na innych stronach

GLSL ES - na kazda inna platforme shadery sa konwertowane z niego, czyli:

- Windows PC/Phone: DirectX HLSL (9 lub 11);

- Mac Os X: OpenGL GLSL;

- Android, iOS: OpenGL GLSL ES;

Reszta po zaznaczeniu okresla kod pod te konkretna platforme, tak w ramach pisania innego kodu optymalnego w GLSL a innego w HLSL.

 

i to oznacza, że na przykład na windowsie ten shader jest tłumaczony z GLSL ES przez kompilator GMa na HLSL (wynikowy kod HLSL widać nawet w plikach vout.shader i fout.shader tworzonych u mnie na kompie gdzies randomowo O.o).

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ę...