Merge pull request #98 from jdgleaver/cc-update

(handheld) Update colour correction shaders
This commit is contained in:
hizzlekizzle 2019-04-18 11:21:15 -05:00 committed by GitHub
commit 77d4efd688
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 76 additions and 67 deletions

View file

@ -21,7 +21,7 @@ layout(std140, set = 0, binding = 0) uniform UBO
*/ */
// Shader that replicates the LCD dynamics from a GameBoy Advance // Shader that replicates the LCD dynamics from a GameBoy Advance
#pragma parameter darken_screen "Darken Screen" 0.5 -0.25 2.0 0.05 #pragma parameter darken_screen "Darken Screen" 0.5 -0.25 1.5 0.05
#define target_gamma 2.2 #define target_gamma 2.2
#define display_gamma 2.2 #define display_gamma 2.2
@ -31,14 +31,14 @@ layout(std140, set = 0, binding = 0) uniform UBO
#define blr 0.0 #define blr 0.0
#define blg 0.0 #define blg 0.0
#define blb 0.0 #define blb 0.0
#define r 0.845 #define r 0.86
#define g 0.68 #define g 0.66
#define b 0.755 #define b 0.81
#define rg 0.09 #define rg 0.11
#define rb 0.16 #define rb 0.1325
#define gr 0.17 #define gr 0.19
#define gb 0.085 #define gb 0.0575
#define br -0.015 #define br -0.05
#define bg 0.23 #define bg 0.23
#define overscan_percent_x 0.0 #define overscan_percent_x 0.0
#define overscan_percent_y 0.0 #define overscan_percent_y 0.0

View file

@ -1,18 +1,8 @@
#version 450 #version 450
/*
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, with some tweaks.
Based on Color Mangler
Author: hunterk
License: Public domain
*/
layout(push_constant) uniform Push layout(push_constant) uniform Push
{ {
float darken_screen; float brighten_screen;
} params; } params;
layout(std140, set = 0, binding = 0) uniform UBO layout(std140, set = 0, binding = 0) uniform UBO
@ -23,22 +13,33 @@ layout(std140, set = 0, binding = 0) uniform UBO
vec4 SourceSize; vec4 SourceSize;
} global; } global;
#pragma parameter darken_screen "Darken Screen" 0.0 -0.25 2.0 0.05 /*
Shader Modified: Pokefan531
Color Mangler
Author: hunterk
License: Public domain
*/
// Shader that replicates the LCD dynamics from a GameBoy Advance
#pragma parameter brighten_screen "Brighten Screen" 0.5 -0.25 1.2 0.05
#define target_gamma 2.2 #define target_gamma 2.2
#define display_gamma 2.2 #define display_gamma 2.2
#define sat 1.0
#define lum 1.0
#define contrast 1.0
#define blr 0.0 #define blr 0.0
#define blg 0.0 #define blg 0.0
#define blb 0.0 #define blb 0.0
#define r 0.78824 #define r 0.87
#define g 0.72941 #define g 0.66
#define b 0.82 #define b 0.79
#define rg 0.025 #define rg 0.115
#define rb 0.12039 #define rb 0.14
#define gr 0.12157 #define gr 0.18
#define gb 0.12157 #define gb 0.07
#define br 0.0 #define br -0.05
#define bg 0.275000 #define bg 0.225
#pragma stage vertex #pragma stage vertex
layout(location = 0) in vec4 Position; layout(location = 0) in vec4 Position;
@ -58,14 +59,22 @@ layout(set = 0, binding = 2) uniform sampler2D Source;
void main() void main()
{ {
vec4 screen = pow(texture(Source, vTexCoord), vec4(target_gamma + params.darken_screen)).rgba; vec4 screen = pow(texture(Source, vTexCoord), vec4(target_gamma + (params.brighten_screen * -1.0))).rgba;
vec4 avglum = vec4(0.5);
screen = mix(screen, avglum, (1.0 - contrast));
// red green blue alpha ; alpha does nothing for our purposes // r g b black
mat4 color = mat4(r, rg, rb, 0.0, //red mat4 color = mat4(r, rg, rb, 0.0, //red channel
gr, g, gb, 0.0, //green gr, g, gb, 0.0, //green channel
br, bg, b, 0.0, //blue br, bg, b, 0.0, //blue channel
blr, blg, blb, 0.0); //black blr, blg, blb, 0.0); //alpha channel; these numbers do nothing for our purposes.
screen = color * screen; mat4 adjust = mat4((1.0 - sat) * 0.3086 + sat, (1.0 - sat) * 0.3086, (1.0 - sat) * 0.3086, 1.0,
FragColor = pow(screen, vec4(1.0 / display_gamma)); (1.0 - sat) * 0.6094, (1.0 - sat) * 0.6094 + sat, (1.0 - sat) * 0.6094, 1.0,
(1.0 - sat) * 0.0820, (1.0 - sat) * 0.0820, (1.0 - sat) * 0.0820 + sat, 1.0,
0.0, 0.0, 0.0, 1.0);
color *= adjust;
screen = clamp(screen * lum, 0.0, 1.0);
screen = color * screen;
FragColor = pow(screen, vec4(1.0 / (display_gamma)));
} }

View file

@ -24,15 +24,15 @@ layout(std140, set = 0, binding = 0) uniform UBO
#define blr 0.0 #define blr 0.0
#define blg 0.0 #define blg 0.0
#define blb 0.0 #define blb 0.0
#define r 0.83 #define r 0.85
#define g 0.65 #define g 0.655
#define b 0.765 #define b 0.865
#define rg 0.105 #define rg 0.095
#define rb 0.105 #define rb 0.06
#define gr 0.20 #define gr 0.20
#define gb 0.13 #define gb 0.075
#define br -0.03 #define br -0.05
#define bg 0.245 #define bg 0.25
#define overscan_percent_x 0.0 #define overscan_percent_x 0.0
#define overscan_percent_y 0.0 #define overscan_percent_y 0.0

View file

@ -31,14 +31,14 @@ layout(std140, set = 0, binding = 0) uniform UBO
#define blr 0.0 #define blr 0.0
#define blg 0.0 #define blg 0.0
#define blb 0.0 #define blb 0.0
#define r 0.745 #define r 0.88
#define g 0.69 #define g 0.69
#define b 0.775 #define b 0.765
#define rg 0.06 #define rg 0.06
#define rb 0.085 #define rb 0.085
#define gr 0.315 #define gr 0.24
#define gb 0.14 #define gb 0.15
#define br -0.06 #define br -0.12
#define bg 0.25 #define bg 0.25
#define overscan_percent_x 0.0 #define overscan_percent_x 0.0
#define overscan_percent_y 0.0 #define overscan_percent_y 0.0

View file

@ -24,15 +24,15 @@ layout(std140, set = 0, binding = 0) uniform UBO
#define blr 0.0 #define blr 0.0
#define blg 0.0 #define blg 0.0
#define blb 0.0 #define blb 0.0
#define r 0.92 #define r 0.98
#define g 0.795 #define g 0.795
#define b 0.975 #define b 0.98
#define rg 0.035 #define rg 0.04
#define rb 0.01 #define rb 0.01
#define gr 0.24 #define gr 0.20
#define gb 0.015 #define gb 0.01
#define br -0.16 #define br -0.18
#define bg 0.17 #define bg 0.165
#define overscan_percent_x 0.0 #define overscan_percent_x 0.0
#define overscan_percent_y 0.0 #define overscan_percent_y 0.0

View file

@ -31,12 +31,12 @@ layout(std140, set = 0, binding = 0) uniform UBO
#define blr 0.0 #define blr 0.0
#define blg 0.0 #define blg 0.0
#define blb 0.0 #define blb 0.0
#define r 0.74 #define r 0.73
#define g 0.68 #define g 0.675
#define b 0.68 #define b 0.675
#define rg 0.08 #define rg 0.085
#define rb 0.08 #define rb 0.085
#define gr 0.26 #define gr 0.27
#define gb 0.24 #define gb 0.24
#define br 0.0 #define br 0.0
#define bg 0.24 #define bg 0.24

View file

@ -9,6 +9,6 @@ scale0 = "1.000000"
filter_linear1 = "false" filter_linear1 = "false"
parameters = "darken_screen;RETRO_PIXEL_SIZE" parameters = "brighten_screen;RETRO_PIXEL_SIZE"
darken_screen = "0.500000" brighten_screen = "0.500000"
RETRO_PIXEL_SIZE = "0.840000" RETRO_PIXEL_SIZE = "0.840000"