Graffiti Shader


GeeXLab - Graffiti shader - GLSL



Downloads

How to run the demo?
Download and unzip GeeXLab and the demopack where you want, launch GeeXLab and drop the demo (main.xml) in GeeXLab. This demo requires OpenGL 2.1+.

 
I found this cool effect in this shadertoy demo. I put the graffiti effect in a simple GeeXLab demo. That’s all!

GeeXLab - Graffiti shader - GLSL

 
In the following pixel shader, tex2 is the background texture (wall) and tex0 and tex1 are the graffiti. The graffiti are textures with green screen background like this one:
GeeXLab - green screen image

Pixel shader:

#version 120
 
#define PI 3.14159265359
 
uniform vec2 u_resolution;
uniform float u_time;
 
varying vec4 v_uv;
 
uniform sampler2D tex0;
uniform sampler2D tex1;
uniform sampler2D tex2;
 
uniform vec4 fx_params; // x=0.01;  y=0.6
 
vec3 graffiti(in vec2 uv, in sampler2D chan, in vec2 lit, float dist)
{
    vec3 col = vec3(0.0);
    vec3 texUV = texture2D(chan,uv).rgb;
    vec2 dShad = lit*vec2(dist);
    vec3 greenRef = texture2D(chan,vec2(.999,.999)).rgb;
 
    float gr =  0.7 - texUV.g; // red patches
    col.gb -= vec2(fx_params.y)*smoothstep(.1, .4, gr);
 
    gr = texture2D(chan,uv - vec2(fx_params.x)).r - texUV.r;	//Black sketch
    col -= smoothstep(.0,.5,gr);
    gr = texture2D(chan,uv + vec2(fx_params.x)).r - texUV.r;
    col -= smoothstep(.0,.5,gr);
 
    float shad = float(any(bvec3(step(.25,abs(texture2D(chan,uv + dShad*(1.-float(any(bvec2(step(1.-dShad,uv)))))).rgb - greenRef)))));
    float mask = float(any(bvec3(step(.25,abs(texUV - greenRef)))));
    col -= shad*(1.-mask);
 
    return col;
}
 
void main() 
{
    vec2 st = v_uv.xy;
    st.y *= -1.0;
 
    vec3 color = texture2D(tex2, st).rgb;
 
    vec2 lit = vec2(0.1, 0.1);
    float dist = 0.025;
    color += graffiti(st, tex0, lit, dist);
    color += graffiti(st, tex1, lit, dist);
 
    gl_FragColor = vec4(color,1.0);
}

GeeXLab - Graffiti shader - GLSL





Leave a Comment

Your email address will not be published. Required fields are marked *