Shaders Using multiple color replacement shaders?

S

Shadowblitz16

Guest
can someone tell me how to use multiple color replacement shaders for a single draw?

its seems when I use two shaders the last one just replaces the the first.

I translated this shader from love2d which worked in that engine
Code:
//
// Color Replace Shader
//
varying vec2 v_vTexcoord;
varying vec4 v_vColour;

uniform vec4 oldColor;
uniform vec4 newColor;

void main()
{ 
    vec4   curColor      = texture2D( gm_BaseTexture, v_vTexcoord ); //This is the current pixel color
    if    (curColor.rgb == oldColor.rgb) gl_FragColor = newColor * v_vColour;
    else                                 gl_FragColor = curColor * v_vColour;
}
Code:
/// @description draw_replace_color()
/// @param old_color
/// @param new_color

if (argument_count == 0)
{
    shader_reset();
}
else
{
    var old_r = color_get_red  (argument[0]) / 255;
    var old_g = color_get_green(argument[0]) / 255;
    var old_b = color_get_blue (argument[0]) / 255;
    var new_r = color_get_red  (argument[1]) / 255;
    var new_g = color_get_green(argument[1]) / 255;
    var new_b = color_get_blue (argument[1]) / 255;
 
    shader_set(shd_default);
    shader_set_uniform_f(shader_get_uniform(shd_default, "oldColor"), old_r, old_g, old_b, 1);
    shader_set_uniform_f(shader_get_uniform(shd_default, "newColor"), new_r, new_g, new_b, 1);
}
here is my draw event for my ship which only replaces 1 color
Code:
/// @description Inhert Event and Draw Wrap

if (team == 0)
{
    draw_replace_color(global.palette[1],  global.palette[2])
    draw_replace_color(global.palette[13], global.palette[14])
}
else if (team == 1)
{
    draw_replace_color(global.palette[1],  global.palette[1])
    draw_replace_color(global.palette[13], global.palette[12])
}
else if (team == 2)
{
    draw_replace_color(global.palette[1],  global.palette[3])
    draw_replace_color(global.palette[13], global.palette[11])
}
else if (team == 3)
{
    draw_replace_color(global.palette[1],  global.palette[9])
    draw_replace_color(global.palette[13], global.palette[10])
}
event_inherited();

if (team == 0 || team == 1 || team == 2 || team == 3)
{
    draw_replace_color()
}
if this isn't possible it should be. especially without the use of multiple surfaces.
 

GMWolf

aka fel666
It probably uses a flipflop/ ping pongp buffer.

So have two surfaces, A and B.
Render scene to A.
Apply first shader and render A to B.
Apply second shader and render B to A.
Apply third shader and render A to B.
Etc etc.


A better alternative is to use a shader that can do multiple colour replacements.

Perhaps using some kind of look up table.
 
Top