Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: Jeffrey Faper en Febrero 17, 2022, 09:37:09 PM

Título: como usar dos shaders al mismo tiempo? [Solucionado]
Publicado por: Jeffrey Faper en Febrero 17, 2022, 09:37:09 PM
Estoy trasteando con shaders,  me parecen increibles pero la mayoria de documentacion esta en ingles asi que lo poco que tengo son shaders de la pagina shaderToy convertidos a shaders  Game Maker 2 uno de estos cambia la tonalidad de la imagen por tiempo y el otro es un shader tipo waves ondas
la duda que tengo es como combinar ambos efectos,  trate de hacer un solo shader con ambos efectos pero siempre me arrojaban errores y ni idea de como solucionarlo
PROYECTO:
https://drive.google.com/file/d/1v31QgyNM6fKaxZmWWslwiFNOWyrP9P3-/view?usp=sharing

SHADER DISCO:
[spoiler]
[gml]
//shDisco
/*
//EVENT CREATE OBJECT:
sh_res  = shader_get_uniform(shDisco,"iResolution");
sh_time = shader_get_uniform(shDisco,"iGlobalTime");


//DRAW_EVENT OBJECT:
shader_set(shDisco)
shader_set_uniform_f(sh_res,512,512,0);
shader_set_uniform_f(sh_time,current_time/1000);
draw_self();
shader_reset()

*/

varying vec2 v_vTexcoord;
varying vec4 v_vColour;

uniform float iGlobalTime;
uniform vec3 iResolution;

void main( void )
{
    //Inputs
    float gridRows = 1.0;
    float gridCols = 1.0;
    float satFactor = 0.5;
    float movingSpeed = 2.0;
   
   
    // Normalized pixel coordinates (from 0 to 1)
    vec2 uv = 1.0/iResolution.xy;
   
    //We find out in which grid the pixel is
    int pixCol = int(uv.x*gridCols);
    int pixRow = int(uv.y*gridRows);
   
    // Time varying pixel color
    vec3 col = satFactor + satFactor*cos(iGlobalTime*movingSpeed+vec3(pixCol,pixRow,pixCol)+vec3(0,2,4));

    // Output to screen
    gl_FragColor = vec4(col,1.0)* texture2D(gm_BaseTexture, v_vTexcoord );
}
[/gml]
[/spoiler]

SOLUCION PROBLEMA :
al dibujar el backgroundWaves con el shader waves activado, se dibujaba la pagina de textura completa en lugar de solo el background
la solucion fue simple dibujar el backgroundWave en una surface y pasar lo dibujado en dicha surface al shader quedando nuestro evento de dibujo de esta manera
[spoiler]
[gml]
//evento draw
    //SHADER WAVES-----------------------------------------------
    //CREATE WAVES SURFACE:
    if(!surface_exists(surfWaves)){
       surfWaves = surface_create(room_width, room_height);
       }
       //draw wave sprite to waves surface:
       surface_set_target(surfWaves);
       draw_background_tiled_ext(backgroundWav,0,0,1,1,c_white,1);
       surface_reset_target();
       
       //DRAW SHADER SURFACE TO SCREEN
       shader_set(shWave);
       shader_set_uniform_f(sh_wtime,current_time/1000);
       shader_set_uniform_f(sh_wscale,mouse_x,5);
       shader_set_uniform_f(sh_wfactor,0.05,0.1);
       draw_surface(surfWaves,0,0);
       shader_reset();
[/gml]
[/spoiler]

SHADER WAVES:
[spoiler]
[gml]
//shWave
/*
//EVENT CREATE
sh_wtime =  shader_get_uniform(shWave,"time");
sh_wscale = shader_get_uniform(shWave,"Scale");
sh_wfactor = shader_get_uniform(shWave,"Factor");

//EVENT DRAW
shader_set(shWave)
shader_set_uniform_f(sh_wtime,current_time/1000);
shader_set_uniform_f(sh_wscale,10,5);
shader_set_uniform_f(sh_wfactor,0.05,0.1);
shader_reset();
*/

varying vec2 v_vTexcoord;
varying vec4 v_vColour;

uniform float time;
uniform vec2 Scale;   // 10,5
uniform vec2 Factor; // 0.05, 0.1

void main() {
     
     vec2 texCoord = v_vTexcoord;
     texCoord.x = texCoord.x+cos(texCoord.y*Scale.x+time*Factor.x)*Factor.y;
     texCoord.y = texCoord.y+sin(texCoord.x*Scale.y+time*Factor.x)*Factor.y;
     
     gl_FragColor = texture2D(gm_BaseTexture, texCoord);
}
[/gml]
[/spoiler]