Skip to content

Commit

Permalink
Add GBC color shader and presets
Browse files Browse the repository at this point in the history
  • Loading branch information
Monroe88 committed Feb 2, 2018
1 parent ff22e57 commit cf51136
Show file tree
Hide file tree
Showing 6 changed files with 347 additions and 0 deletions.
121 changes: 121 additions & 0 deletions handheld/gbc-color.glsl
@@ -0,0 +1,121 @@
/*
GBC Color Correction Shader
A shader that replicates the LCD dynamics from a Game Boy Color
Color values are derived from Gambatte's color correction implementation.
Based on Color Mangler
Author: hunterk
License: Public domain
*/

// Compatibility #ifdefs needed for parameters
#ifdef GL_ES
#define COMPAT_PRECISION mediump
#else
#define COMPAT_PRECISION
#endif


#define blr 0.0
#define blg 0.0
#define blb 0.0
#define r 0.78824
#define g 0.72941
#define b 0.66667
#define rg 0.00
#define rb 0.18039
#define gr 0.12157
#define gb 0.12157
#define br 0.05882
#define bg 0.24314

#if defined(VERTEX)

#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_VARYING vec4 COL0;
COMPAT_VARYING vec4 TEX0;

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;

void main()
{
gl_Position = MVPMatrix * VertexCoord;
COL0 = COLOR;
TEX0.xy = TexCoord.xy;
}

#elif defined(FRAGMENT)

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

#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

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;

// compatibility #defines
#define Source Texture
#define vTexCoord TEX0.xy

#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize
#define outsize vec4(OutputSize, 1.0 / OutputSize)

void main()
{
vec4 screen = COMPAT_TEXTURE(Source, vTexCoord);

// r g b black
mat4 color = mat4(r, rg, rb, 0.0, //red channel
gr, g, gb, 0.0, //green channel
br, bg, b, 0.0, //blue channel
blr, blg, blb, 0.0); //alpha channel; these numbers do nothing for our purposes.

screen = color * screen;
FragColor = screen;
}
#endif
32 changes: 32 additions & 0 deletions handheld/lcd-grid-v2-gbc-color-motionblur.glslp
@@ -0,0 +1,32 @@
shaders = "3"

shader0 = "../motionblur/shaders/motionblur-simple.glsl"
filter_linear0 = "false"
scale_type0 = "source"
scale0 = "1.0"

shader1 = "shaders/lcd-cgwg/lcd-grid-v2.glsl"
filter_linear1 = "false"
scale_type1 = "viewport"
scale1 = "1.0"

shader2 = "shaders/color/gbc-color.glsl"
filter_linear2 = "false"
scale_type2 = "source"
scale2 = "1.0"

parameters = "RSUBPIX_R;RSUBPIX_G;RSUBPIX_B;GSUBPIX_R;GSUBPIX_G;GSUBPIX_B;BSUBPIX_R;BSUBPIX_G;BSUBPIX_B;gain;gamma;blacklevel;ambient;BGR"
RSUBPIX_R = "0.750000"
RSUBPIX_G = "0.000000"
RSUBPIX_B = "0.000000"
GSUBPIX_R = "0.000000"
GSUBPIX_G = "0.750000"
GSUBPIX_B = "0.000000"
BSUBPIX_R = "0.000000"
BSUBPIX_G = "0.000000"
BSUBPIX_B = "0.750000"
gain = "1.500000"
gamma = "2.200000"
blacklevel = "0.000000"
ambient = "0.000000"
BGR = "1.000000"
27 changes: 27 additions & 0 deletions handheld/lcd-grid-v2-gbc-color.glslp
@@ -0,0 +1,27 @@
shaders = "2"

shader0 = "shaders/lcd-cgwg/lcd-grid-v2.glsl"
filter_linear0 = "false"
scale_type0 = "viewport"
scale0 = "1.0"

shader1 = "shaders/color/gbc-color.glsl"
filter_linear1 = "false"
scale_type1 = "source"
scale1 = "1.0"

parameters = "RSUBPIX_R;RSUBPIX_G;RSUBPIX_B;GSUBPIX_R;GSUBPIX_G;GSUBPIX_B;BSUBPIX_R;BSUBPIX_G;BSUBPIX_B;gain;gamma;blacklevel;ambient;BGR"
RSUBPIX_R = "0.750000"
RSUBPIX_G = "0.000000"
RSUBPIX_B = "0.000000"
GSUBPIX_R = "0.000000"
GSUBPIX_G = "0.750000"
GSUBPIX_B = "0.000000"
BSUBPIX_R = "0.000000"
BSUBPIX_G = "0.000000"
BSUBPIX_B = "0.750000"
gain = "1.500000"
gamma = "2.200000"
blacklevel = "0.000000"
ambient = "0.000000"
BGR = "1.000000"
33 changes: 33 additions & 0 deletions handheld/lcd-shader-gbc-color.glslp
@@ -0,0 +1,33 @@
shaders = 5
shader0 = shaders/lcd-shader/lcd-pass-0.glsl
shader1 = shaders/lcd-shader/lcd-pass-1.glsl
shader2 = shaders/lcd-shader/lcd-pass-2.glsl
shader3 = shaders/lcd-shader/lcd-pass-3.glsl
shader4 = shaders/color/gbc-color.glsl

scale_type0 = viewport
scale0 = 1

scale_type1 = source
scale1 = 1

scale_type2 = source
scale2 = 1

scale_type3 = source
scale3 = 1

scale_type4 = source
scale4 = 1

filter_linear0 = false
filter_linear1 = false
filter_linear2 = false
filter_linear3 = false
filter_linear4 = false

textures = BACKGROUND
BACKGROUND = shaders/lcd-shader/background.png
BACKGROUND_linear = true
parameters = "display_gamma"
display_gamma = "2.200000"
121 changes: 121 additions & 0 deletions handheld/shaders/color/gbc-color.glsl
@@ -0,0 +1,121 @@
/*
GBC Color Correction Shader
A shader that replicates the LCD dynamics from a Game Boy Color
Color values are derived from Gambatte's color correction implementation.
Based on Color Mangler
Author: hunterk
License: Public domain
*/

// Compatibility #ifdefs needed for parameters
#ifdef GL_ES
#define COMPAT_PRECISION mediump
#else
#define COMPAT_PRECISION
#endif


#define blr 0.0
#define blg 0.0
#define blb 0.0
#define r 0.78824
#define g 0.72941
#define b 0.66667
#define rg 0.00
#define rb 0.18039
#define gr 0.12157
#define gb 0.12157
#define br 0.05882
#define bg 0.24314

#if defined(VERTEX)

#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_VARYING vec4 COL0;
COMPAT_VARYING vec4 TEX0;

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;

void main()
{
gl_Position = MVPMatrix * VertexCoord;
COL0 = COLOR;
TEX0.xy = TexCoord.xy;
}

#elif defined(FRAGMENT)

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

#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

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;

// compatibility #defines
#define Source Texture
#define vTexCoord TEX0.xy

#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize
#define outsize vec4(OutputSize, 1.0 / OutputSize)

void main()
{
vec4 screen = COMPAT_TEXTURE(Source, vTexCoord);

// r g b black
mat4 color = mat4(r, rg, rb, 0.0, //red channel
gr, g, gb, 0.0, //green channel
br, bg, b, 0.0, //blue channel
blr, blg, blb, 0.0); //alpha channel; these numbers do nothing for our purposes.

screen = color * screen;
FragColor = screen;
}
#endif
13 changes: 13 additions & 0 deletions presets/retro-v2+gbc-color.glslp
@@ -0,0 +1,13 @@
shaders = "2"

shader0 = "../handheld/shaders/color/gbc-color.glsl"
shader1 = "../retro/shaders/retro-v2.glsl"

filter_linear0 = "false"
scale_type0 = "source"
scale0 = "1.000000"

filter_linear1 = "false"

parameters = "RETRO_PIXEL_SIZE"
RETRO_PIXEL_SIZE = "0.840000"

0 comments on commit cf51136

Please sign in to comment.