• Hey Guest! Ever feel like entering a Game Jam, but the time limit is always too much pressure? We get it... You lead a hectic life and dedicating 3 whole days to make a game just doesn't work for you! So, why not enter the GMC SLOW JAM? Take your time! Kick back and make your game over 4 months! Interested? Then just click here!

Shaders porting zfast_crt.glsl

hangred

Member
Hello All,

I am trying to port the zfast_crt.glsl shader running in GMS2. I am using the following resources:
This is my converted Vertex code:
GML:
/*
    zfast_crt_standard - A simple, fast CRT shader.
    Copyright (C) 2017 Greg Hogan (SoltanGris42)
    This program is free software; you can redistribute it and/or modify it
    under the terms of the GNU General Public License as published by the Free
    Software Foundation; either version 2 of the License, or (at your option)
    any later version.
Notes:  This shader does scaling with a weighted linear filter for adjustable
    sharpness on the x and y axes based on the algorithm by Inigo Quilez here:
    http://http://www.iquilezles.org/www/articles/texture/texture.htm
    but modified to be somewhat sharper.  Then a scanline effect that varies
    based on pixel brighness is applied along with a monochrome aperture mask.
    This shader runs at 60fps on the Raspberry Pi 3 hardware at 2mpix/s
    resolutions (1920x1080 or 1600x1200).
*/

//For testing compilation
//#define FRAGMENT
//#define VERTEX

//This can't be an option without slowing the shader down
//Comment this out for a coarser 3 pixel mask...which is currently broken
//on SNES Classic Edition due to Mali 400 gpu precision
#define FINEMASK
//Some drivers don't return black with texture coordinates out of bounds
//SNES Classic is too slow to black these areas out when using fullscreen
//overlays.  But you can uncomment the below to black them out if necessary
//#define BLACK_OUT_BORDER

// Parameter lines go here:
#pragma parameter BLURSCALEX "Blur Amount X-Axis" 0.30 0.0 1.0 0.05
#pragma parameter LOWLUMSCAN "Scanline Darkness - Low" 6.0 0.0 10.0 0.5
#pragma parameter HILUMSCAN "Scanline Darkness - High" 8.0 0.0 50.0 1.0
#pragma parameter BRIGHTBOOST "Dark Pixel Brightness Boost" 1.25 0.5 1.5 0.05
#pragma parameter MASK_DARK "Mask Effect Amount" 0.25 0.0 1.0 0.05
#pragma parameter MASK_FADE "Mask/Scanline Fade" 0.8 0.0 1.0 0.05

#if __VERSION__ >= 130
#define COMPAT_VARYING out
#define COMPAT_ATTRIBUTE in
#define COMPAT_TEXTURE texture
#else
#define COMPAT_VARYING varying
#define COMPAT_ATTRIBUTE attribute
#define COMPAT_TEXTURE texture2D
#endif

#ifdef GL_ES
#define COMPAT_PRECISION mediump
#else
#define COMPAT_PRECISION
#endif

COMPAT_ATTRIBUTE vec4 VertexCoord;
COMPAT_ATTRIBUTE vec4 COLOR;
COMPAT_ATTRIBUTE vec4 TexCoord;
COMPAT_ATTRIBUTE vec3 in_Position;
COMPAT_VARYING vec4 COL0;
COMPAT_VARYING vec4 TEX0;
COMPAT_VARYING float maskFade;
COMPAT_VARYING vec2 invDims;
COMPAT_VARYING vec2 FragCoord;

vec4 _oPosition1;
uniform mat4 MVPMatrix;
uniform COMPAT_PRECISION int FrameDirection;
uniform COMPAT_PRECISION int FrameCount;
uniform COMPAT_PRECISION vec2 OutputSize;
uniform COMPAT_PRECISION vec2 TextureSize;
uniform COMPAT_PRECISION vec2 InputSize;

// compatibility #defines
#define vTexCoord TEX0.xy
#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize
#define OutSize vec4(OutputSize, 1.0 / OutputSize)

#ifdef PARAMETER_UNIFORM
// All parameter floats need to have COMPAT_PRECISION in front of them
uniform COMPAT_PRECISION float BLURSCALEX;
//uniform COMPAT_PRECISION float BLURSCALEY;
uniform COMPAT_PRECISION float LOWLUMSCAN;
uniform COMPAT_PRECISION float HILUMSCAN;
uniform COMPAT_PRECISION float BRIGHTBOOST;
uniform COMPAT_PRECISION float MASK_DARK;
uniform COMPAT_PRECISION float MASK_FADE;
#else
#define BLURSCALEX 0.45
//#define BLURSCALEY 0.20
#define LOWLUMSCAN 5.0
#define HILUMSCAN 10.0
#define BRIGHTBOOST 1.25
#define MASK_DARK 0.25
#define MASK_FADE 0.8
#endif

void main()
{
    gl_Position = MVPMatrix * VertexCoord;
    TEX0.xy = (TexCoord.xy);
    maskFade = 0.3333*MASK_FADE;
    invDims = 1.0/TextureSize.xy;
    FragCoord = in_Position.xy;   
}
This is the converted Fragment code:
GML:
#ifdef GL_ES
#ifdef GL_FRAGMENT_PRECISION_HIGH
precision highp float;
#else
precision mediump float;
#endif
#define COMPAT_PRECISION mediump
#else
#define COMPAT_PRECISION
#endif

#if __VERSION__ >= 130
#define COMPAT_VARYING in
#define COMPAT_TEXTURE texture
out COMPAT_PRECISION vec4 FragColor;
#else
#define COMPAT_VARYING varying
#define FragColor gl_FragColor
#define COMPAT_TEXTURE texture2D
#endif

uniform COMPAT_PRECISION int FrameDirection;
uniform COMPAT_PRECISION int FrameCount;
uniform COMPAT_PRECISION vec2 OutputSize;
uniform COMPAT_PRECISION vec2 TextureSize;
uniform COMPAT_PRECISION vec2 InputSize;
uniform sampler2D Texture;
COMPAT_VARYING vec4 TEX0;
COMPAT_VARYING float maskFade;
COMPAT_VARYING vec2 invDims;
COMPAT_VARYING vec2 FragCoord;

// compatibility #defines
#define Source Texture
#define vTexCoord TEX0.xy
#define texture(c, d) COMPAT_TEXTURE(c, d)
#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize
#define OutSize vec4(OutputSize, 1.0 / OutputSize)

#ifdef PARAMETER_UNIFORM
// All parameter floats need to have COMPAT_PRECISION in front of them
uniform COMPAT_PRECISION float BLURSCALEX;
//uniform COMPAT_PRECISION float BLURSCALEY;
uniform COMPAT_PRECISION float LOWLUMSCAN;
uniform COMPAT_PRECISION float HILUMSCAN;
uniform COMPAT_PRECISION float BRIGHTBOOST;
uniform COMPAT_PRECISION float MASK_DARK;
uniform COMPAT_PRECISION float MASK_FADE;
#else
#define BLURSCALEX 0.45
//#define BLURSCALEY 0.20
#define LOWLUMSCAN 5.0
#define HILUMSCAN 10.0
#define BRIGHTBOOST 1.25
#define MASK_DARK 0.25
#define MASK_FADE 0.8
#endif

void main()
{
    //This is just like "Quilez Scaling" but sharper
    COMPAT_PRECISION vec2 p = vTexCoord * TextureSize;
    COMPAT_PRECISION vec2 i = floor(p) + 0.50;
    COMPAT_PRECISION vec2 f = p - i;
    p = (i + 4.0*f*f*f)*invDims;
    p.x = mix( p.x , vTexCoord.x, BLURSCALEX);
    COMPAT_PRECISION float Y = f.y*f.y;
    COMPAT_PRECISION float YY = Y*Y;
    
#if defined(FINEMASK)
    //COMPAT_PRECISION float whichmask = fract( gl_FragCoord.x*-0.4999);
    COMPAT_PRECISION float whichmask = fract( FragCoord.x*-0.4999);
    COMPAT_PRECISION float mask = 1.0 + float(whichmask < 0.5) * -MASK_DARK;
#else
    //COMPAT_PRECISION float whichmask = fract(gl_FragCoord.x * -0.3333);
    COMPAT_PRECISION float whichmask = fract(FragCoord.x * -0.3333);   
    COMPAT_PRECISION float mask = 1.0 + float(whichmask <= 0.33333) * -MASK_DARK;
#endif
    COMPAT_PRECISION vec3 colour = COMPAT_TEXTURE(Source, p).rgb;
    
    COMPAT_PRECISION float scanLineWeight = (BRIGHTBOOST - LOWLUMSCAN*(Y - 2.05*YY));
    COMPAT_PRECISION float scanLineWeightB = 1.0 - HILUMSCAN*(YY-2.8*YY*Y);   
    
#if defined(BLACK_OUT_BORDER)
    colour.rgb*=float(tc.x > 0.0)*float(tc.y > 0.0); //why doesn't the driver do the right thing?
#endif

    FragColor.rgb = colour.rgb*mix(scanLineWeight*mask, scanLineWeightB, dot(colour.rgb,vec3(maskFade)));
    
}
Here is the create code from my object:
GML:
application_surface_draw_enable(false);
uFrameDirection = shader_get_uniform(zfast2,"FrameDirection");
uFrameCount = shader_get_uniform(zfast2,"FrameCount");
uOutputSize = shader_get_uniform(zfast2,"OutputSize");
uTextureSize = shader_get_uniform(zfast2,"TextureSize");
uInputSize = shader_get_uniform(zfast2,"InputSize");
uBLURSCALEX = shader_get_uniform(zfast2,"BLURSCALEX");
uLOWLUMSCAN = shader_get_uniform(zfast2,"LOWLUMSCAN");
uHILUMSCAN = shader_get_uniform(zfast2,"HILUMSCAN");
uBRIGHTBOOST = shader_get_uniform(zfast2,"BRIGHTBOOST");
uMASK_DARK = shader_get_uniform(zfast2,"MASK_DARK");
uMASK_FADE = shader_get_uniform(zfast2,"MASK_FADE");
Here is the Post Draw from my object:
GML:
shader_set(zfast3);
//shader_set_uniform_i(uFrameCount,60);
//shader_set_uniform_i(uFrameDirection,1);
shader_set_uniform_i(uOutputSize,896,504);
shader_set_uniform_i(uInputSize,896,504);
shader_set_uniform_i(uTextureSize,896,504);
draw_surface(application_surface,0,0);
shader_reset();
My game resolution is 896x504. Not sure what to do regarding uFrameCount or uFrameDirection. When I run this I only get a black screen. Has anyone else tried to convert and run zfast_crt?
 
Top