wip/crt

 
var game = new Phaser.Game(800, 600, Phaser.AUTO, 'phaser-example', { preload: preload, create: create, update: update });

var filter;

function preload() {

    game.load.image('metal', 'assets/textures/metal.png');

}

function create() {

    var fragmentSrc = [
        "precision mediump float;",

        "uniform vec3      iResolution;",
        "uniform float     iGlobalTime;",
        "uniform float     iChannelTime[4];",
        "uniform vec4      iMouse;",
        "uniform vec4      iDate;",
        "uniform vec3      iChannelResolution[4];",
        "uniform int      iFrame;",
        "uniform float      iTimeDelta;",
        "uniform float      iFrameRate;",

        "struct Channel {",
        "vec3 resolution;",
        "float time;",
        "};",
        "uniform Channel xiChannel[4];",
        "uniform sampler2D iChannel0;",

        "// add any extra uniforms here",

        "// Loosely based on postprocessing shader by inigo quilez, License Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.",

        "vec2 curve(vec2 uv)",
        "{",
            "uv = (uv - 0.5) * 2.0;",
            "uv *= 1.1;",
            "uv.x *= 1.0 + pow((abs(uv.y) / 5.0), 2.0);",
            "uv.y *= 1.0 + pow((abs(uv.x) / 4.0), 2.0);",
            "uv  = (uv / 2.0) + 0.5;",
            "uv =  uv *0.92 + 0.04;",
            "return uv;",
        "}",
        "void mainImage( out vec4 fragColor, in vec2 fragCoord )",
        "{",
            "vec2 q = fragCoord.xy / iResolution.xy;",
            "vec2 uv = q;",
            "uv = curve( uv );",
            "vec3 oricol = texture2D( iChannel0, vec2(q.x,q.y) ).xyz;",
            "vec3 col;",
            "float x =  sin(0.3*iGlobalTime+uv.y*21.0)*sin(0.7*iGlobalTime+uv.y*29.0)*sin(0.3+0.33*iGlobalTime+uv.y*31.0)*0.0017;",

            "col.r = texture2D(iChannel0,vec2(x+uv.x+0.001,uv.y+0.001)).x+0.05;",
            "col.g = texture2D(iChannel0,vec2(x+uv.x+0.000,uv.y-0.002)).y+0.05;",
            "col.b = texture2D(iChannel0,vec2(x+uv.x-0.002,uv.y+0.000)).z+0.05;",
            "col.r += 0.08*texture2D(iChannel0,0.75*vec2(x+0.025, -0.027)+vec2(uv.x+0.001,uv.y+0.001)).x;",
            "col.g += 0.05*texture2D(iChannel0,0.75*vec2(x+-0.022, -0.02)+vec2(uv.x+0.000,uv.y-0.002)).y;",
            "col.b += 0.08*texture2D(iChannel0,0.75*vec2(x+-0.02, -0.018)+vec2(uv.x-0.002,uv.y+0.000)).z;",

            "col = clamp(col*0.6+0.4*col*col*1.0,0.0,1.0);",

            "float vig = (0.0 + 1.0*16.0*uv.x*uv.y*(1.0-uv.x)*(1.0-uv.y));",
            "col *= vec3(pow(vig,0.3));",

            "col *= vec3(0.95,1.05,0.95);",
            "col *= 2.8;",

            "float scans = clamp( 0.35+0.35*sin(3.5*iGlobalTime+uv.y*iResolution.y*1.5), 0.0, 1.0);",

            "float s = pow(scans,1.7);",
            "col = col*vec3( 0.4+0.7*s) ;",

            "col *= 1.0+0.01*sin(110.0*iGlobalTime);",
            "if (uv.x < 0.0 || uv.x > 1.0)",
            "col *= 0.0;",
            "if (uv.y < 0.0 || uv.y > 1.0)",
            "col *= 0.0;",

            "col*=1.0-0.65*vec3(clamp((mod(fragCoord.x, 2.0)-1.0)*2.0,0.0,1.0));",

            "float comp = smoothstep( 0.1, 0.9, sin(iGlobalTime) );",

            "// Remove the next line to stop cross-fade between original and postprocess",
            "// col = mix( col, oricol, comp );",

            "fragColor = vec4(col,1.0);",
        "}",

        "void main(void) {",
            "vec4 color = vec4(0.0, 0.0, 0.0, 1.0);",
            "mainImage(color, gl_FragCoord.xy);",
            "color.w = 1.0;",
            "gl_FragColor = color;",
        "}"
    ];

    var bob = game.add.sprite(0, 0, 'metal');

    filter = new Phaser.Filter(game, null, fragmentSrc);
    filter.setResolution(800, 600);

    filter.uniforms.iChannel0.value = bob.texture;

    var sprite = game.add.sprite(0, 0);
    sprite.width = 800;
    sprite.height = 600;

    sprite.filters = [ filter ];

}

function update() {

    filter.update();

}