diff --git a/handheld/gbc-color.glsl b/handheld/gbc-color.glsl new file mode 100644 index 00000000..f3801085 --- /dev/null +++ b/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 diff --git a/handheld/lcd-grid-v2-gbc-color-motionblur.glslp b/handheld/lcd-grid-v2-gbc-color-motionblur.glslp new file mode 100644 index 00000000..0fa0c5ef --- /dev/null +++ b/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" diff --git a/handheld/lcd-grid-v2-gbc-color.glslp b/handheld/lcd-grid-v2-gbc-color.glslp new file mode 100644 index 00000000..e88544d5 --- /dev/null +++ b/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" diff --git a/handheld/lcd-shader-gbc-color.glslp b/handheld/lcd-shader-gbc-color.glslp new file mode 100644 index 00000000..988b6dbc --- /dev/null +++ b/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" \ No newline at end of file diff --git a/handheld/shaders/color/gbc-color.glsl b/handheld/shaders/color/gbc-color.glsl new file mode 100644 index 00000000..f3801085 --- /dev/null +++ b/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 diff --git a/presets/retro-v2+gbc-color.glslp b/presets/retro-v2+gbc-color.glslp new file mode 100644 index 00000000..5a054389 --- /dev/null +++ b/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"