From 396ef5751f055c4c51d0ea226e7ca9968c6be3a9 Mon Sep 17 00:00:00 2001 From: jdgleaver Date: Wed, 7 Aug 2019 13:32:23 +0100 Subject: [PATCH] (simpletex_lcd) Add simpletex_lcd_720p shaders + colour correction fixes --- .../simpletex_lcd+gba-color-4k.slang | 2 +- .../simpletex_lcd+gba-color.slang | 2 +- .../simpletex_lcd+gbc-color-4k.slang | 2 +- .../simpletex_lcd+gbc-color.slang | 2 +- .../simpletex_lcd_720p+gba-color.slang | 200 ++++++++++++++++++ .../simpletex_lcd_720p+gbc-color.slang | 200 ++++++++++++++++++ .../simpletex_lcd/simpletex_lcd_720p.slang | 180 ++++++++++++++++ handheld/simpletex_lcd+gba-color-4k.slangp | 4 +- handheld/simpletex_lcd+gba-color.slangp | 4 +- handheld/simpletex_lcd+gbc-color-4k.slangp | 4 +- handheld/simpletex_lcd+gbc-color.slangp | 4 +- handheld/simpletex_lcd-4k.slangp | 4 +- handheld/simpletex_lcd.slangp | 4 +- handheld/simpletex_lcd_720p+gba-color.slangp | 21 ++ handheld/simpletex_lcd_720p+gbc-color.slangp | 21 ++ handheld/simpletex_lcd_720p.slangp | 21 ++ 16 files changed, 659 insertions(+), 16 deletions(-) create mode 100644 handheld/shaders/simpletex_lcd/simpletex_lcd_720p+gba-color.slang create mode 100644 handheld/shaders/simpletex_lcd/simpletex_lcd_720p+gbc-color.slang create mode 100644 handheld/shaders/simpletex_lcd/simpletex_lcd_720p.slang create mode 100644 handheld/simpletex_lcd_720p+gba-color.slangp create mode 100644 handheld/simpletex_lcd_720p+gbc-color.slangp create mode 100644 handheld/simpletex_lcd_720p.slangp diff --git a/handheld/shaders/simpletex_lcd/simpletex_lcd+gba-color-4k.slang b/handheld/shaders/simpletex_lcd/simpletex_lcd+gba-color-4k.slang index 6136ba9..24f6d07 100644 --- a/handheld/shaders/simpletex_lcd/simpletex_lcd+gba-color-4k.slang +++ b/handheld/shaders/simpletex_lcd/simpletex_lcd+gba-color-4k.slang @@ -146,7 +146,7 @@ void main() vec3 colour = texture(Source, registers.SourceSize.zw * imgCenterCoord.xy).rgb; // Darken colours (if required...) and apply colour correction - colour.rgb = pow(colour.rgb, vec3(TARGET_GAMMA + registers.DARKEN_COLOUR)); + colour.rgb = pow(colour.rgb, vec3(TARGET_GAMMA + 0.5 + registers.DARKEN_COLOUR)); colour.rgb = mat3(CC_R, CC_RG, CC_RB, CC_GR, CC_G, CC_GB, CC_BR, CC_BG, CC_B) * colour.rgb; diff --git a/handheld/shaders/simpletex_lcd/simpletex_lcd+gba-color.slang b/handheld/shaders/simpletex_lcd/simpletex_lcd+gba-color.slang index f3ddbfd..84508c0 100644 --- a/handheld/shaders/simpletex_lcd/simpletex_lcd+gba-color.slang +++ b/handheld/shaders/simpletex_lcd/simpletex_lcd+gba-color.slang @@ -146,7 +146,7 @@ void main() vec3 colour = texture(Source, registers.SourceSize.zw * imgCenterCoord.xy).rgb; // Darken colours (if required...) and apply colour correction - colour.rgb = pow(colour.rgb, vec3(TARGET_GAMMA + registers.DARKEN_COLOUR)); + colour.rgb = pow(colour.rgb, vec3(TARGET_GAMMA + 0.5 + registers.DARKEN_COLOUR)); colour.rgb = mat3(CC_R, CC_RG, CC_RB, CC_GR, CC_G, CC_GB, CC_BR, CC_BG, CC_B) * colour.rgb; diff --git a/handheld/shaders/simpletex_lcd/simpletex_lcd+gbc-color-4k.slang b/handheld/shaders/simpletex_lcd/simpletex_lcd+gbc-color-4k.slang index c49028a..767e77a 100644 --- a/handheld/shaders/simpletex_lcd/simpletex_lcd+gbc-color-4k.slang +++ b/handheld/shaders/simpletex_lcd/simpletex_lcd+gbc-color-4k.slang @@ -146,7 +146,7 @@ void main() vec3 colour = texture(Source, registers.SourceSize.zw * imgCenterCoord.xy).rgb; // Darken colours (if required...) and apply colour correction - colour.rgb = pow(colour.rgb, vec3(TARGET_GAMMA + registers.DARKEN_COLOUR)); + colour.rgb = pow(colour.rgb, vec3(TARGET_GAMMA - 0.5 + registers.DARKEN_COLOUR)); colour.rgb = mat3(CC_R, CC_RG, CC_RB, CC_GR, CC_G, CC_GB, CC_BR, CC_BG, CC_B) * colour.rgb; diff --git a/handheld/shaders/simpletex_lcd/simpletex_lcd+gbc-color.slang b/handheld/shaders/simpletex_lcd/simpletex_lcd+gbc-color.slang index 2111d70..a6acce8 100644 --- a/handheld/shaders/simpletex_lcd/simpletex_lcd+gbc-color.slang +++ b/handheld/shaders/simpletex_lcd/simpletex_lcd+gbc-color.slang @@ -146,7 +146,7 @@ void main() vec3 colour = texture(Source, registers.SourceSize.zw * imgCenterCoord.xy).rgb; // Darken colours (if required...) and apply colour correction - colour.rgb = pow(colour.rgb, vec3(TARGET_GAMMA + registers.DARKEN_COLOUR)); + colour.rgb = pow(colour.rgb, vec3(TARGET_GAMMA - 0.5 + registers.DARKEN_COLOUR)); colour.rgb = mat3(CC_R, CC_RG, CC_RB, CC_GR, CC_G, CC_GB, CC_BR, CC_BG, CC_B) * colour.rgb; diff --git a/handheld/shaders/simpletex_lcd/simpletex_lcd_720p+gba-color.slang b/handheld/shaders/simpletex_lcd/simpletex_lcd_720p+gba-color.slang new file mode 100644 index 0000000..5e10bc1 --- /dev/null +++ b/handheld/shaders/simpletex_lcd/simpletex_lcd_720p+gba-color.slang @@ -0,0 +1,200 @@ +#version 450 + +/* + simpletex_lcd_720p+gba-color - a simple, textured LCD shader intended for non-backlit systems. + Designed for use at 720p, without integer scaling. Includes GBA colour correction. + + - Makes use of grid effect from lcd3x + [original lcd3x code written by Gigaherz and released into the public domain] + + - Colour correction code taken from 'gba-color', written by hunterk, modified by Pokefan531 + and realeased into the public domain + + Other code by jdgleaver + + Usage notes: + + - Background texture size is hard-coded (I can't find a way to get this + automatically...). User must ensure that 'BG_TEXTURE_SIZE' define is + set appropriately. + + - Adjustable parameters: + + > GRID_INTENSITY: Sets overall visibility of grid effect + - 1.0: Grid is shown + - 0.0: Grid is invisible (same colour as pixels) + > GRID_WIDTH: Sets effective with of grid lines + - 1.0: Maximum width + - 0.0: Minimum width + (Note - this is kind of a hack: changing the width + also changes the grid intensity, but we have to do + it like this otherwise the grid is uneven without + integer scaling enabled...) + > GRID_BIAS: Dynamically adjusts the grid intensity based on pixel luminosity + - 0.0: Grid intensity is uniform + - 1.0: Grid intensity scales linearly with pixel luminosity + > i.e. the darker the pixel, the less the grid effect + is apparent - black pixels exhibit no grid effect at all + > DARKEN_GRID: Darkens grid (duh...) + - 0.0: Grid is white + - 1.0: Grid is black + > DARKEN_COLOUR: Simply darkens pixel colours (effectively lowers gamma level of pixels) + - 0.0: Colours are normal + - 2.0: Colours are too dark... + + 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. +*/ + +// Background texture size +// > 2048 x 2048 textures are suitable for screen resolutions up to +// 1200p (or 1440p if running 'square' aspect ratio systems) +#define BG_TEXTURE_SIZE 2048.0 +// > 4096 x 4096 textures are suitable for screen resolutions up to 4k +//#define BG_TEXTURE_SIZE 4096.0 + +#pragma parameter GRID_INTENSITY "Grid Intensity" 0.9 0.0 1.0 0.01 +#pragma parameter GRID_WIDTH "Grid Width" 0.9 0.0 1.0 0.01 +#pragma parameter GRID_BIAS "Grid Bias" 0.5 0.0 1.0 0.01 +#pragma parameter DARKEN_GRID "Darken Grid" 0.0 0.0 1.0 0.01 +#pragma parameter DARKEN_COLOUR "Darken Colours" 0.0 0.0 2.0 0.01 + +layout(push_constant) uniform Push +{ + float GRID_INTENSITY; + float GRID_WIDTH; + float GRID_BIAS; + float DARKEN_GRID; + float DARKEN_COLOUR; + vec4 OutputSize; + vec4 OriginalSize; + vec4 SourceSize; +} registers; + +layout(std140, set = 0, binding = 0) uniform UBO +{ + mat4 MVP; +} global; + +#pragma stage vertex + +layout(location = 0) in vec4 Position; +layout(location = 1) in vec2 TexCoord; +layout(location = 0) out vec2 vTexCoord; + +/* + VERTEX_SHADER +*/ +void main() +{ + gl_Position = global.MVP * Position; + vTexCoord = TexCoord; +} + +#pragma stage fragment + +layout(location = 0) in vec2 vTexCoord; +layout(location = 0) out vec4 FragColor; +layout(set = 0, binding = 2) uniform sampler2D Source; +layout(set = 0, binding = 3) uniform sampler2D BACKGROUND; + +// ### Magic Numbers... + +// Grid parameters +#define PI 3.141592654 +#define WIDTH_FACTOR_MAX 31.0 + +// RGB -> Luminosity conversion +// > Photometric/digital ITU BT.709 +#define LUMA_R 0.2126 +#define LUMA_G 0.7152 +#define LUMA_B 0.0722 +// > Digital ITU BT.601 +//#define LUMA_R 0.299 +//#define LUMA_G 0.587 +//#define LUMA_B 0.114 + +// Background texture size +const float INV_BG_TEXTURE_SIZE = 1.0 / BG_TEXTURE_SIZE; + +// Colour correction +#define TARGET_GAMMA 2.2 +const float INV_DISPLAY_GAMMA = 1.0 / 2.2; +#define CC_R 0.86 +#define CC_G 0.66 +#define CC_B 0.81 +#define CC_RG 0.11 +#define CC_RB 0.1325 +#define CC_GR 0.19 +#define CC_GB 0.0575 +#define CC_BR -0.05 +#define CC_BG 0.23 + +/* + FRAGMENT SHADER +*/ +void main() +{ + // Get current texture coordinate + vec2 imgPixelCoord = vTexCoord.xy * registers.SourceSize.xy; + vec2 imgCenterCoord = floor(imgPixelCoord.xy) + vec2(0.5, 0.5); + + // Get colour of current pixel + vec3 colour = texture(Source, registers.SourceSize.zw * imgCenterCoord.xy).rgb; + + // Darken colours (if required...) and apply colour correction + colour.rgb = pow(colour.rgb, vec3(TARGET_GAMMA + 0.5 + registers.DARKEN_COLOUR)); + colour.rgb = mat3(CC_R, CC_RG, CC_RB, + CC_GR, CC_G, CC_GB, + CC_BR, CC_BG, CC_B) * colour.rgb; + colour.rgb = clamp(pow(colour.rgb, vec3(INV_DISPLAY_GAMMA)), 0.0, 1.0); + + // Generate grid pattern... + // > Note the 0.25 pixel offset -> required to ensure that + // grid lines occur *between* pixels + vec2 angle = 2.0 * PI * (imgPixelCoord - 0.25); + + float wfactor = 1.0 + (WIDTH_FACTOR_MAX - (registers.GRID_WIDTH * WIDTH_FACTOR_MAX)); + float yfactor = (wfactor + sin(angle.y)) / (wfactor + 1.0); + float xfactor = (wfactor + sin(angle.x)) / (wfactor + 1.0); + + float lineWeight = 1.0 - (yfactor * xfactor); + + // > Apply grid adjustments (phase 1) + // - GRID_INTENSITY: + // 1.0: Grid lines are white + // 0.0: Grid lines are invisible + lineWeight = lineWeight * registers.GRID_INTENSITY; + + // > Apply grid adjustments (phase 2) + // - GRID_BIAS: + // 0.0: Use 'unbiased' lineWeight value calculated above + // 1.0: Scale lineWeight by current pixel luminosity + // > i.e. the darker the pixel, the lower the intensity of the grid + float luma = (LUMA_R * colour.r) + (LUMA_G * colour.g) + (LUMA_B * colour.b); + lineWeight = lineWeight * (luma + ((1.0 - luma) * (1.0 - registers.GRID_BIAS))); + + // Apply grid pattern + // (lineWeight == 1 -> set colour to value specified by DARKEN_GRID) + colour.rgb = mix(colour.rgb, vec3(1.0 - registers.DARKEN_GRID), lineWeight); + + // Get background sample point + // > NB: external texture coordinates are referenced in a completely different fashion + // here than they are in GLSL shaders... + vec2 bgPixelCoord = floor(vTexCoord.xy * registers.OutputSize.xy) + vec2(0.5, 0.5); + + // Sample background texture and 'colourise' according to current pixel colour + // (NB: the 'colourisation' here is lame, but the proper method is slow...) + vec3 bgTexture = texture(BACKGROUND, bgPixelCoord.xy * INV_BG_TEXTURE_SIZE).rgb * colour.rgb; + + // Blend current pixel with background according to luminosity + // (lighter colour == more transparent, more visible background) + // Note: Have to calculate luminosity a second time... tiresome, but + // it's not a particulary expensive operation... + luma = (LUMA_R * colour.r) + (LUMA_G * colour.g) + (LUMA_B * colour.b); + colour.rgb = mix(colour.rgb, bgTexture.rgb, luma); + + FragColor = vec4(colour.rgb, 1.0); +} diff --git a/handheld/shaders/simpletex_lcd/simpletex_lcd_720p+gbc-color.slang b/handheld/shaders/simpletex_lcd/simpletex_lcd_720p+gbc-color.slang new file mode 100644 index 0000000..85b8fc4 --- /dev/null +++ b/handheld/shaders/simpletex_lcd/simpletex_lcd_720p+gbc-color.slang @@ -0,0 +1,200 @@ +#version 450 + +/* + simpletex_lcd_720p+gbc-color - a simple, textured LCD shader intended for non-backlit systems. + Designed for use at 720p, without integer scaling. Includes GBC colour correction. + + - Makes use of grid effect from lcd3x + [original lcd3x code written by Gigaherz and released into the public domain] + + - Colour correction code taken from 'gbc-color', written by hunterk and realeased + into the public domain, with further tweaks by Pokefan531 + + Other code by jdgleaver + + Usage notes: + + - Background texture size is hard-coded (I can't find a way to get this + automatically...). User must ensure that 'BG_TEXTURE_SIZE' define is + set appropriately. + + - Adjustable parameters: + + > GRID_INTENSITY: Sets overall visibility of grid effect + - 1.0: Grid is shown + - 0.0: Grid is invisible (same colour as pixels) + > GRID_WIDTH: Sets effective with of grid lines + - 1.0: Maximum width + - 0.0: Minimum width + (Note - this is kind of a hack: changing the width + also changes the grid intensity, but we have to do + it like this otherwise the grid is uneven without + integer scaling enabled...) + > GRID_BIAS: Dynamically adjusts the grid intensity based on pixel luminosity + - 0.0: Grid intensity is uniform + - 1.0: Grid intensity scales linearly with pixel luminosity + > i.e. the darker the pixel, the less the grid effect + is apparent - black pixels exhibit no grid effect at all + > DARKEN_GRID: Darkens grid (duh...) + - 0.0: Grid is white + - 1.0: Grid is black + > DARKEN_COLOUR: Simply darkens pixel colours (effectively lowers gamma level of pixels) + - 0.0: Colours are normal + - 2.0: Colours are too dark... + + 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. +*/ + +// Background texture size +// > 2048 x 2048 textures are suitable for screen resolutions up to +// 1200p (or 1440p if running 'square' aspect ratio systems) +#define BG_TEXTURE_SIZE 2048.0 +// > 4096 x 4096 textures are suitable for screen resolutions up to 4k +//#define BG_TEXTURE_SIZE 4096.0 + +#pragma parameter GRID_INTENSITY "Grid Intensity" 0.9 0.0 1.0 0.01 +#pragma parameter GRID_WIDTH "Grid Width" 0.9 0.0 1.0 0.01 +#pragma parameter GRID_BIAS "Grid Bias" 0.5 0.0 1.0 0.01 +#pragma parameter DARKEN_GRID "Darken Grid" 0.0 0.0 1.0 0.01 +#pragma parameter DARKEN_COLOUR "Darken Colours" 0.0 0.0 2.0 0.01 + +layout(push_constant) uniform Push +{ + float GRID_INTENSITY; + float GRID_WIDTH; + float GRID_BIAS; + float DARKEN_GRID; + float DARKEN_COLOUR; + vec4 OutputSize; + vec4 OriginalSize; + vec4 SourceSize; +} registers; + +layout(std140, set = 0, binding = 0) uniform UBO +{ + mat4 MVP; +} global; + +#pragma stage vertex + +layout(location = 0) in vec4 Position; +layout(location = 1) in vec2 TexCoord; +layout(location = 0) out vec2 vTexCoord; + +/* + VERTEX_SHADER +*/ +void main() +{ + gl_Position = global.MVP * Position; + vTexCoord = TexCoord; +} + +#pragma stage fragment + +layout(location = 0) in vec2 vTexCoord; +layout(location = 0) out vec4 FragColor; +layout(set = 0, binding = 2) uniform sampler2D Source; +layout(set = 0, binding = 3) uniform sampler2D BACKGROUND; + +// ### Magic Numbers... + +// Grid parameters +#define PI 3.141592654 +#define WIDTH_FACTOR_MAX 31.0 + +// RGB -> Luminosity conversion +// > Photometric/digital ITU BT.709 +#define LUMA_R 0.2126 +#define LUMA_G 0.7152 +#define LUMA_B 0.0722 +// > Digital ITU BT.601 +//#define LUMA_R 0.299 +//#define LUMA_G 0.587 +//#define LUMA_B 0.114 + +// Background texture size +const float INV_BG_TEXTURE_SIZE = 1.0 / BG_TEXTURE_SIZE; + +// Colour correction +#define TARGET_GAMMA 2.2 +const float INV_DISPLAY_GAMMA = 1.0 / 2.2; +#define CC_R 0.87 +#define CC_G 0.66 +#define CC_B 0.79 +#define CC_RG 0.115 +#define CC_RB 0.14 +#define CC_GR 0.18 +#define CC_GB 0.07 +#define CC_BR -0.05 +#define CC_BG 0.225 + +/* + FRAGMENT SHADER +*/ +void main() +{ + // Get current texture coordinate + vec2 imgPixelCoord = vTexCoord.xy * registers.SourceSize.xy; + vec2 imgCenterCoord = floor(imgPixelCoord.xy) + vec2(0.5, 0.5); + + // Get colour of current pixel + vec3 colour = texture(Source, registers.SourceSize.zw * imgCenterCoord.xy).rgb; + + // Darken colours (if required...) and apply colour correction + colour.rgb = pow(colour.rgb, vec3(TARGET_GAMMA - 0.5 + registers.DARKEN_COLOUR)); + colour.rgb = mat3(CC_R, CC_RG, CC_RB, + CC_GR, CC_G, CC_GB, + CC_BR, CC_BG, CC_B) * colour.rgb; + colour.rgb = clamp(pow(colour.rgb, vec3(INV_DISPLAY_GAMMA)), 0.0, 1.0); + + // Generate grid pattern... + // > Note the 0.25 pixel offset -> required to ensure that + // grid lines occur *between* pixels + vec2 angle = 2.0 * PI * (imgPixelCoord - 0.25); + + float wfactor = 1.0 + (WIDTH_FACTOR_MAX - (registers.GRID_WIDTH * WIDTH_FACTOR_MAX)); + float yfactor = (wfactor + sin(angle.y)) / (wfactor + 1.0); + float xfactor = (wfactor + sin(angle.x)) / (wfactor + 1.0); + + float lineWeight = 1.0 - (yfactor * xfactor); + + // > Apply grid adjustments (phase 1) + // - GRID_INTENSITY: + // 1.0: Grid lines are white + // 0.0: Grid lines are invisible + lineWeight = lineWeight * registers.GRID_INTENSITY; + + // > Apply grid adjustments (phase 2) + // - GRID_BIAS: + // 0.0: Use 'unbiased' lineWeight value calculated above + // 1.0: Scale lineWeight by current pixel luminosity + // > i.e. the darker the pixel, the lower the intensity of the grid + float luma = (LUMA_R * colour.r) + (LUMA_G * colour.g) + (LUMA_B * colour.b); + lineWeight = lineWeight * (luma + ((1.0 - luma) * (1.0 - registers.GRID_BIAS))); + + // Apply grid pattern + // (lineWeight == 1 -> set colour to value specified by DARKEN_GRID) + colour.rgb = mix(colour.rgb, vec3(1.0 - registers.DARKEN_GRID), lineWeight); + + // Get background sample point + // > NB: external texture coordinates are referenced in a completely different fashion + // here than they are in GLSL shaders... + vec2 bgPixelCoord = floor(vTexCoord.xy * registers.OutputSize.xy) + vec2(0.5, 0.5); + + // Sample background texture and 'colourise' according to current pixel colour + // (NB: the 'colourisation' here is lame, but the proper method is slow...) + vec3 bgTexture = texture(BACKGROUND, bgPixelCoord.xy * INV_BG_TEXTURE_SIZE).rgb * colour.rgb; + + // Blend current pixel with background according to luminosity + // (lighter colour == more transparent, more visible background) + // Note: Have to calculate luminosity a second time... tiresome, but + // it's not a particulary expensive operation... + luma = (LUMA_R * colour.r) + (LUMA_G * colour.g) + (LUMA_B * colour.b); + colour.rgb = mix(colour.rgb, bgTexture.rgb, luma); + + FragColor = vec4(colour.rgb, 1.0); +} diff --git a/handheld/shaders/simpletex_lcd/simpletex_lcd_720p.slang b/handheld/shaders/simpletex_lcd/simpletex_lcd_720p.slang new file mode 100644 index 0000000..92e344c --- /dev/null +++ b/handheld/shaders/simpletex_lcd/simpletex_lcd_720p.slang @@ -0,0 +1,180 @@ +#version 450 + +/* + simpletex_lcd_720p - a simple, textured LCD shader intended for non-backlit systems. + Designed for use at 720p, without integer scaling. + + - Makes use of grid effect from lcd3x + [original lcd3x code written by Gigaherz and released into the public domain] + + Other code by jdgleaver + + Usage notes: + + - Background texture size is hard-coded (I can't find a way to get this + automatically...). User must ensure that 'BG_TEXTURE_SIZE' define is + set appropriately. + + - Adjustable parameters: + + > GRID_INTENSITY: Sets overall visibility of grid effect + - 1.0: Grid is shown + - 0.0: Grid is invisible (same colour as pixels) + > GRID_WIDTH: Sets effective with of grid lines + - 1.0: Maximum width + - 0.0: Minimum width + (Note - this is kind of a hack: changing the width + also changes the grid intensity, but we have to do + it like this otherwise the grid is uneven without + integer scaling enabled...) + > GRID_BIAS: Dynamically adjusts the grid intensity based on pixel luminosity + - 0.0: Grid intensity is uniform + - 1.0: Grid intensity scales linearly with pixel luminosity + > i.e. the darker the pixel, the less the grid effect + is apparent - black pixels exhibit no grid effect at all + > DARKEN_GRID: Darkens grid (duh...) + - 0.0: Grid is white + - 1.0: Grid is black + > DARKEN_COLOUR: Simply darkens pixel colours (effectively lowers gamma level of pixels) + - 0.0: Colours are normal + - 2.0: Colours are too dark... + + 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. +*/ + +// Background texture size +// > 2048 x 2048 textures are suitable for screen resolutions up to +// 1200p (or 1440p if running 'square' aspect ratio systems) +#define BG_TEXTURE_SIZE 2048.0 +// > 4096 x 4096 textures are suitable for screen resolutions up to 4k +//#define BG_TEXTURE_SIZE 4096.0 + +#pragma parameter GRID_INTENSITY "Grid Intensity" 0.9 0.0 1.0 0.01 +#pragma parameter GRID_WIDTH "Grid Width" 0.9 0.0 1.0 0.01 +#pragma parameter GRID_BIAS "Grid Bias" 0.5 0.0 1.0 0.01 +#pragma parameter DARKEN_GRID "Darken Grid" 0.0 0.0 1.0 0.01 +#pragma parameter DARKEN_COLOUR "Darken Colours" 0.0 0.0 2.0 0.01 + +layout(push_constant) uniform Push +{ + float GRID_INTENSITY; + float GRID_WIDTH; + float GRID_BIAS; + float DARKEN_GRID; + float DARKEN_COLOUR; + vec4 OutputSize; + vec4 OriginalSize; + vec4 SourceSize; +} registers; + +layout(std140, set = 0, binding = 0) uniform UBO +{ + mat4 MVP; +} global; + +#pragma stage vertex + +layout(location = 0) in vec4 Position; +layout(location = 1) in vec2 TexCoord; +layout(location = 0) out vec2 vTexCoord; + +/* + VERTEX_SHADER +*/ +void main() +{ + gl_Position = global.MVP * Position; + vTexCoord = TexCoord; +} + +#pragma stage fragment + +layout(location = 0) in vec2 vTexCoord; +layout(location = 0) out vec4 FragColor; +layout(set = 0, binding = 2) uniform sampler2D Source; +layout(set = 0, binding = 3) uniform sampler2D BACKGROUND; + +// ### Magic Numbers... + +// Grid parameters +#define PI 3.141592654 +#define WIDTH_FACTOR_MAX 31.0 + +// RGB -> Luminosity conversion +// > Photometric/digital ITU BT.709 +#define LUMA_R 0.2126 +#define LUMA_G 0.7152 +#define LUMA_B 0.0722 +// > Digital ITU BT.601 +//#define LUMA_R 0.299 +//#define LUMA_G 0.587 +//#define LUMA_B 0.114 + +// Background texture size +const float INV_BG_TEXTURE_SIZE = 1.0 / BG_TEXTURE_SIZE; + +/* + FRAGMENT SHADER +*/ +void main() +{ + // Get current texture coordinate + vec2 imgPixelCoord = vTexCoord.xy * registers.SourceSize.xy; + vec2 imgCenterCoord = floor(imgPixelCoord.xy) + vec2(0.5, 0.5); + + // Get colour of current pixel + vec3 colour = texture(Source, registers.SourceSize.zw * imgCenterCoord.xy).rgb; + + // Darken colours (if required...) + colour.rgb = pow(colour.rgb, vec3(1.0 + registers.DARKEN_COLOUR)); + + // Generate grid pattern... + // > Note the 0.25 pixel offset -> required to ensure that + // grid lines occur *between* pixels + vec2 angle = 2.0 * PI * (imgPixelCoord - 0.25); + + float wfactor = 1.0 + (WIDTH_FACTOR_MAX - (registers.GRID_WIDTH * WIDTH_FACTOR_MAX)); + float yfactor = (wfactor + sin(angle.y)) / (wfactor + 1.0); + float xfactor = (wfactor + sin(angle.x)) / (wfactor + 1.0); + + float lineWeight = 1.0 - (yfactor * xfactor); + + // > Apply grid adjustments (phase 1) + // - GRID_INTENSITY: + // 1.0: Grid lines are white + // 0.0: Grid lines are invisible + lineWeight = lineWeight * registers.GRID_INTENSITY; + + // > Apply grid adjustments (phase 2) + // - GRID_BIAS: + // 0.0: Use 'unbiased' lineWeight value calculated above + // 1.0: Scale lineWeight by current pixel luminosity + // > i.e. the darker the pixel, the lower the intensity of the grid + float luma = (LUMA_R * colour.r) + (LUMA_G * colour.g) + (LUMA_B * colour.b); + lineWeight = lineWeight * (luma + ((1.0 - luma) * (1.0 - registers.GRID_BIAS))); + + // Apply grid pattern + // (lineWeight == 1 -> set colour to value specified by DARKEN_GRID) + colour.rgb = mix(colour.rgb, vec3(1.0 - registers.DARKEN_GRID), lineWeight); + + // Get background sample point + // > NB: external texture coordinates are referenced in a completely different fashion + // here than they are in GLSL shaders... + vec2 bgPixelCoord = floor(vTexCoord.xy * registers.OutputSize.xy) + vec2(0.5, 0.5); + + // Sample background texture and 'colourise' according to current pixel colour + // (NB: the 'colourisation' here is lame, but the proper method is slow...) + vec3 bgTexture = texture(BACKGROUND, bgPixelCoord.xy * INV_BG_TEXTURE_SIZE).rgb * colour.rgb; + + // Blend current pixel with background according to luminosity + // (lighter colour == more transparent, more visible background) + // Note: Have to calculate luminosity a second time... tiresome, but + // it's not a particulary expensive operation... + luma = (LUMA_R * colour.r) + (LUMA_G * colour.g) + (LUMA_B * colour.b); + colour.rgb = mix(colour.rgb, bgTexture.rgb, luma); + + FragColor = vec4(colour.rgb, 1.0); +} diff --git a/handheld/simpletex_lcd+gba-color-4k.slangp b/handheld/simpletex_lcd+gba-color-4k.slangp index 79140f5..462f331 100644 --- a/handheld/simpletex_lcd+gba-color-4k.slangp +++ b/handheld/simpletex_lcd+gba-color-4k.slangp @@ -15,7 +15,7 @@ BACKGROUND_linear = false parameters = "GRID_INTENSITY;GRID_WIDTH;GRID_BIAS;DARKEN_GRID;DARKEN_COLOUR" GRID_INTENSITY = "0.65" -GRID_WIDTH = "0.6" +GRID_WIDTH = "0.65" GRID_BIAS = "0.6" DARKEN_GRID = "0.0" -DARKEN_COLOUR = "0.35" +DARKEN_COLOUR = "0.05" diff --git a/handheld/simpletex_lcd+gba-color.slangp b/handheld/simpletex_lcd+gba-color.slangp index ec57799..efd20bb 100644 --- a/handheld/simpletex_lcd+gba-color.slangp +++ b/handheld/simpletex_lcd+gba-color.slangp @@ -15,7 +15,7 @@ BACKGROUND_linear = false parameters = "GRID_INTENSITY;GRID_WIDTH;GRID_BIAS;DARKEN_GRID;DARKEN_COLOUR" GRID_INTENSITY = "0.65" -GRID_WIDTH = "0.6" +GRID_WIDTH = "0.65" GRID_BIAS = "0.6" DARKEN_GRID = "0.0" -DARKEN_COLOUR = "0.35" +DARKEN_COLOUR = "0.05" diff --git a/handheld/simpletex_lcd+gbc-color-4k.slangp b/handheld/simpletex_lcd+gbc-color-4k.slangp index 1f85b00..4bc765f 100644 --- a/handheld/simpletex_lcd+gbc-color-4k.slangp +++ b/handheld/simpletex_lcd+gbc-color-4k.slangp @@ -14,8 +14,8 @@ BACKGROUND = "shaders/simpletex_lcd/png/4k/textured_paper.png" BACKGROUND_linear = false parameters = "GRID_INTENSITY;GRID_WIDTH;GRID_BIAS;DARKEN_GRID;DARKEN_COLOUR" -GRID_INTENSITY = "0.8" +GRID_INTENSITY = "0.65" GRID_WIDTH = "0.65" -GRID_BIAS = "0.5" +GRID_BIAS = "0.6" DARKEN_GRID = "0.0" DARKEN_COLOUR = "0.05" diff --git a/handheld/simpletex_lcd+gbc-color.slangp b/handheld/simpletex_lcd+gbc-color.slangp index a4169dd..08b8667 100644 --- a/handheld/simpletex_lcd+gbc-color.slangp +++ b/handheld/simpletex_lcd+gbc-color.slangp @@ -14,8 +14,8 @@ BACKGROUND = "shaders/simpletex_lcd/png/2k/textured_paper.png" BACKGROUND_linear = false parameters = "GRID_INTENSITY;GRID_WIDTH;GRID_BIAS;DARKEN_GRID;DARKEN_COLOUR" -GRID_INTENSITY = "0.8" +GRID_INTENSITY = "0.65" GRID_WIDTH = "0.65" -GRID_BIAS = "0.5" +GRID_BIAS = "0.6" DARKEN_GRID = "0.0" DARKEN_COLOUR = "0.05" diff --git a/handheld/simpletex_lcd-4k.slangp b/handheld/simpletex_lcd-4k.slangp index a5ab314..48be5b2 100644 --- a/handheld/simpletex_lcd-4k.slangp +++ b/handheld/simpletex_lcd-4k.slangp @@ -14,8 +14,8 @@ BACKGROUND = "shaders/simpletex_lcd/png/4k/textured_paper.png" BACKGROUND_linear = false parameters = "GRID_INTENSITY;GRID_WIDTH;GRID_BIAS;DARKEN_GRID;DARKEN_COLOUR" -GRID_INTENSITY = "0.8" +GRID_INTENSITY = "0.65" GRID_WIDTH = "0.65" -GRID_BIAS = "0.5" +GRID_BIAS = "0.6" DARKEN_GRID = "0.0" DARKEN_COLOUR = "0.05" diff --git a/handheld/simpletex_lcd.slangp b/handheld/simpletex_lcd.slangp index 9c57219..d58dcab 100644 --- a/handheld/simpletex_lcd.slangp +++ b/handheld/simpletex_lcd.slangp @@ -14,8 +14,8 @@ BACKGROUND = "shaders/simpletex_lcd/png/2k/textured_paper.png" BACKGROUND_linear = false parameters = "GRID_INTENSITY;GRID_WIDTH;GRID_BIAS;DARKEN_GRID;DARKEN_COLOUR" -GRID_INTENSITY = "0.8" +GRID_INTENSITY = "0.65" GRID_WIDTH = "0.65" -GRID_BIAS = "0.5" +GRID_BIAS = "0.6" DARKEN_GRID = "0.0" DARKEN_COLOUR = "0.05" diff --git a/handheld/simpletex_lcd_720p+gba-color.slangp b/handheld/simpletex_lcd_720p+gba-color.slangp new file mode 100644 index 0000000..1084826 --- /dev/null +++ b/handheld/simpletex_lcd_720p+gba-color.slangp @@ -0,0 +1,21 @@ +shaders = "1" + +shader0 = "shaders/simpletex_lcd/simpletex_lcd_720p+gba-color.slang" + +filter_linear0 = "true" +wrap_mode0 = "clamp_to_border" +mipmap_input0 = "false" +alias0 = "" +float_framebuffer0 = "false" +srgb_framebuffer0 = "false" + +textures = "BACKGROUND" +BACKGROUND = "shaders/simpletex_lcd/png/2k/textured_paper.png" +BACKGROUND_linear = false + +parameters = "GRID_INTENSITY;GRID_WIDTH;GRID_BIAS;DARKEN_GRID;DARKEN_COLOUR" +GRID_INTENSITY = "0.72" +GRID_WIDTH = "0.94" +GRID_BIAS = "0.80" +DARKEN_GRID = "0.0" +DARKEN_COLOUR = "0.10" diff --git a/handheld/simpletex_lcd_720p+gbc-color.slangp b/handheld/simpletex_lcd_720p+gbc-color.slangp new file mode 100644 index 0000000..87683b0 --- /dev/null +++ b/handheld/simpletex_lcd_720p+gbc-color.slangp @@ -0,0 +1,21 @@ +shaders = "1" + +shader0 = "shaders/simpletex_lcd/simpletex_lcd_720p+gbc-color.slang" + +filter_linear0 = "true" +wrap_mode0 = "clamp_to_border" +mipmap_input0 = "false" +alias0 = "" +float_framebuffer0 = "false" +srgb_framebuffer0 = "false" + +textures = "BACKGROUND" +BACKGROUND = "shaders/simpletex_lcd/png/2k/textured_paper.png" +BACKGROUND_linear = false + +parameters = "GRID_INTENSITY;GRID_WIDTH;GRID_BIAS;DARKEN_GRID;DARKEN_COLOUR" +GRID_INTENSITY = "0.72" +GRID_WIDTH = "0.94" +GRID_BIAS = "0.80" +DARKEN_GRID = "0.0" +DARKEN_COLOUR = "0.10" diff --git a/handheld/simpletex_lcd_720p.slangp b/handheld/simpletex_lcd_720p.slangp new file mode 100644 index 0000000..a60002a --- /dev/null +++ b/handheld/simpletex_lcd_720p.slangp @@ -0,0 +1,21 @@ +shaders = "1" + +shader0 = "shaders/simpletex_lcd/simpletex_lcd_720p.slang" + +filter_linear0 = "true" +wrap_mode0 = "clamp_to_border" +mipmap_input0 = "false" +alias0 = "" +float_framebuffer0 = "false" +srgb_framebuffer0 = "false" + +textures = "BACKGROUND" +BACKGROUND = "shaders/simpletex_lcd/png/2k/textured_paper.png" +BACKGROUND_linear = false + +parameters = "GRID_INTENSITY;GRID_WIDTH;GRID_BIAS;DARKEN_GRID;DARKEN_COLOUR" +GRID_INTENSITY = "0.72" +GRID_WIDTH = "0.94" +GRID_BIAS = "0.80" +DARKEN_GRID = "0.0" +DARKEN_COLOUR = "0.10"