From ffc0db124380c70469d26dc5a0a3748b147f9695 Mon Sep 17 00:00:00 2001 From: Arzed Five Date: Sun, 7 Aug 2016 00:15:10 +0100 Subject: [PATCH] (handheld) Add parameters to lcd-grid-v2 and port a Cg preset that uses it. --- handheld/lcd-cgwg/lcd-grid-v2.slang | 170 ++++++++++-------- .../lcd-grid-v2-gba-color-motionblur.slangp | 32 ++++ 2 files changed, 126 insertions(+), 76 deletions(-) create mode 100644 handheld/lcd-grid-v2-gba-color-motionblur.slangp diff --git a/handheld/lcd-cgwg/lcd-grid-v2.slang b/handheld/lcd-cgwg/lcd-grid-v2.slang index 7593d86..6204eaa 100644 --- a/handheld/lcd-cgwg/lcd-grid-v2.slang +++ b/handheld/lcd-cgwg/lcd-grid-v2.slang @@ -1,31 +1,49 @@ #version 450 +layout(push_constant) uniform Push +{ + float RSUBPIX_R; + float RSUBPIX_G; + float RSUBPIX_B; + float GSUBPIX_R; + float GSUBPIX_G; + float GSUBPIX_B; + float BSUBPIX_R; + float BSUBPIX_G; + float BSUBPIX_B; + float gain; + float gamma; + float blacklevel; + float ambient; + float BGR; +} param; + +#pragma parameter RSUBPIX_R "Colour of R subpixel: R" 1.0 0.0 1.0 0.01 +#pragma parameter RSUBPIX_G "Colour of R subpixel: G" 0.0 0.0 1.0 0.01 +#pragma parameter RSUBPIX_B "Colour of R subpixel: B" 0.0 0.0 1.0 0.01 +#pragma parameter GSUBPIX_R "Colour of G subpixel: R" 0.0 0.0 1.0 0.01 +#pragma parameter GSUBPIX_G "Colour of G subpixel: G" 1.0 0.0 1.0 0.01 +#pragma parameter GSUBPIX_B "Colour of G subpixel: B" 0.0 0.0 1.0 0.01 +#pragma parameter BSUBPIX_R "Colour of B subpixel: R" 0.0 0.0 1.0 0.01 +#pragma parameter BSUBPIX_G "Colour of B subpixel: G" 0.0 0.0 1.0 0.01 +#pragma parameter BSUBPIX_B "Colour of B subpixel: B" 1.0 0.0 1.0 0.01 +#pragma parameter gain "Gain" 1.0 0.5 2.0 0.05 +#pragma parameter gamma "LCD Gamma" 3.0 0.5 5.0 0.1 +#pragma parameter blacklevel "Black level" 0.05 0.0 0.5 0.01 +#pragma parameter ambient "Ambient" 0.0 0.0 0.5 0.01 +#pragma parameter BGR "BGR" 0 0 1 1 + layout(std140, set = 0, binding = 0) uniform UBO { - mat4 MVP; - vec4 OutputSize; - vec4 OriginalSize; - vec4 SourceSize; + mat4 MVP; + vec4 OutputSize; + vec4 OriginalSize; + vec4 SourceSize; } global; -#define RSUBPIX_R 1.0 -#define RSUBPIX_G 0.0 -#define RSUBPIX_B 0.0 -#define GSUBPIX_R 0.0 -#define GSUBPIX_G 1.0 -#define GSUBPIX_B 0.0 -#define BSUBPIX_R 0.0 -#define BSUBPIX_G 0.0 -#define BSUBPIX_B 1.0 -#define gain 1.0 -#define gamma 3.0 -#define blacklevel 0.05 -#define ambient 0.0 -#define BGR 0.0 - #define outgamma 2.2 -#define fetch_offset(coord,offset) (pow(vec3(gain) * texelFetchOffset(Source, (coord), 0, (offset)).rgb + vec3(blacklevel), vec3(gamma)) + vec3(ambient)) +#define fetch_offset(coord, offset) (pow(vec3(param.gain) * texelFetchOffset(Source, (coord), 0, (offset)).rgb + vec3(param.blacklevel), vec3(param.gamma)) + vec3(param.ambient)) #pragma stage vertex layout(location = 0) in vec4 Position; @@ -34,8 +52,8 @@ layout(location = 0) out vec2 vTexCoord; void main() { - gl_Position = global.MVP * Position; - vTexCoord = TexCoord; + gl_Position = global.MVP * Position; + vTexCoord = TexCoord; } #pragma stage fragment @@ -44,71 +62,71 @@ layout(location = 0) out vec4 FragColor; layout(set = 0, binding = 2) uniform sampler2D Source; // integral of (1 - x^2 - x^4 + x^6)^2 -float coeffs_x[] = float[](1.0, -2.0/3.0, -1.0/5.0, 4.0/7.0, -1.0/9.0, -2.0/11.0, 1.0/13.0); +float coeffs_x[7] = float[](1.0, -2.0/3.0, -1.0/5.0, 4.0/7.0, -1.0/9.0, -2.0/11.0, 1.0/13.0); // integral of (1 - 2x^4 + x^6)^2 -float coeffs_y[] = float[](1.0, 0.0, -4.0/5.0, 2.0/7.0, 4.0/9.0, -4.0/11.0, 1.0/13.0); +float coeffs_y[7] = float[](1.0, 0.0, -4.0/5.0, 2.0/7.0, 4.0/9.0, -4.0/11.0, 1.0/13.0); float intsmear_func(float z, float coeffs[7]) { - float z2 = z*z; - float zn = z; - float ret = 0.0; - for (int i = 0; i < 7; i++) { - ret += zn*coeffs[i]; - zn *= z2; - } - return ret; + float z2 = z*z; + float zn = z; + float ret = 0.0; + for (int i = 0; i < 7; i++) { + ret += zn*coeffs[i]; + zn *= z2; + } + return ret; } float intsmear(float x, float dx, float d, float coeffs[7]) { - float zl = clamp((x-dx*0.5)/d,-1.0,1.0); - float zh = clamp((x+dx*0.5)/d,-1.0,1.0); - return d * ( intsmear_func(zh,coeffs) - intsmear_func(zl,coeffs) )/dx; + float zl = clamp((x-dx*0.5)/d,-1.0,1.0); + float zh = clamp((x+dx*0.5)/d,-1.0,1.0); + return d * ( intsmear_func(zh,coeffs) - intsmear_func(zl,coeffs) )/dx; } void main() { - vec2 texelSize = global.SourceSize.zw; - vec2 range; - range = global.SourceSize.xy / (global.OutputSize.xy * global.SourceSize.xy); - - vec3 cred = pow(vec3(RSUBPIX_R, RSUBPIX_G, RSUBPIX_B), vec3(outgamma)); - vec3 cgreen = pow(vec3(GSUBPIX_R, GSUBPIX_G, GSUBPIX_B), vec3(outgamma)); - vec3 cblue = pow(vec3(BSUBPIX_R, BSUBPIX_G, BSUBPIX_B), vec3(outgamma)); + vec2 texelSize = global.SourceSize.zw; + /* float2 range = IN.video_size / (IN.output_size * IN.texture_size); */ + vec2 range = global.OutputSize.zw; - ivec2 tli = ivec2(floor(vTexCoord/texelSize-vec2(0.4999))); - - vec3 lcol, rcol; - float subpix = (vTexCoord.x/texelSize.x - 0.4999 - float(tli.x))*3.0; - float rsubpix = range.x/texelSize.x * 3.0; - - lcol = vec3(intsmear(subpix+1.0,rsubpix, 1.5, coeffs_x), - intsmear(subpix ,rsubpix, 1.5, coeffs_x), - intsmear(subpix-1.0,rsubpix, 1.5, coeffs_x)); - rcol = vec3(intsmear(subpix-2.0,rsubpix, 1.5, coeffs_x), - intsmear(subpix-3.0,rsubpix, 1.5, coeffs_x), - intsmear(subpix-4.0,rsubpix, 1.5, coeffs_x)); - - if (BGR > 0.5) { - lcol.rgb = lcol.bgr; - rcol.rgb = rcol.bgr; - } - - float tcol, bcol; - subpix = vTexCoord.y/texelSize.y - 0.4999 - float(tli.y); - rsubpix = range.y/texelSize.y; - tcol = intsmear(subpix ,rsubpix, 0.63, coeffs_y); - bcol = intsmear(subpix-1.0,rsubpix, 0.63, coeffs_y); - - vec3 topLeftColor = fetch_offset(tli, ivec2(0,0)) * lcol * vec3(tcol); - vec3 bottomRightColor = fetch_offset(tli, ivec2(1,1)) * rcol * vec3(bcol); - vec3 bottomLeftColor = fetch_offset(tli, ivec2(0,1)) * lcol * vec3(bcol); - vec3 topRightColor = fetch_offset(tli, ivec2(1,0)) * rcol * vec3(tcol); - - vec3 averageColor = topLeftColor + bottomRightColor + bottomLeftColor + topRightColor; + vec3 cred = pow(vec3(param.RSUBPIX_R, param.RSUBPIX_G, param.RSUBPIX_B), vec3(outgamma)); + vec3 cgreen = pow(vec3(param.GSUBPIX_R, param.GSUBPIX_G, param.GSUBPIX_B), vec3(outgamma)); + vec3 cblue = pow(vec3(param.BSUBPIX_R, param.BSUBPIX_G, param.BSUBPIX_B), vec3(outgamma)); - averageColor = averageColor * mat3(cred, cgreen, cblue); - - FragColor = vec4(pow(averageColor,vec3(1.0/outgamma)),0.0); -} \ No newline at end of file + ivec2 tli = ivec2(floor(vTexCoord/texelSize-vec2(0.4999))); + + vec3 lcol, rcol; + float subpix = (vTexCoord.x/texelSize.x - 0.4999 - float(tli.x))*3.0; + float rsubpix = range.x/texelSize.x * 3.0; + + lcol = vec3(intsmear(subpix+1.0, rsubpix, 1.5, coeffs_x), + intsmear(subpix , rsubpix, 1.5, coeffs_x), + intsmear(subpix-1.0, rsubpix, 1.5, coeffs_x)); + rcol = vec3(intsmear(subpix-2.0, rsubpix, 1.5, coeffs_x), + intsmear(subpix-3.0, rsubpix, 1.5, coeffs_x), + intsmear(subpix-4.0, rsubpix, 1.5, coeffs_x)); + + if (param.BGR > 0.5) { + lcol.rgb = lcol.bgr; + rcol.rgb = rcol.bgr; + } + + float tcol, bcol; + subpix = vTexCoord.y/texelSize.y - 0.4999 - float(tli.y); + rsubpix = range.y/texelSize.y; + tcol = intsmear(subpix ,rsubpix, 0.63, coeffs_y); + bcol = intsmear(subpix-1.0,rsubpix, 0.63, coeffs_y); + + vec3 topLeftColor = fetch_offset(tli, ivec2(0,0)) * lcol * vec3(tcol); + vec3 bottomRightColor = fetch_offset(tli, ivec2(1,1)) * rcol * vec3(bcol); + vec3 bottomLeftColor = fetch_offset(tli, ivec2(0,1)) * lcol * vec3(bcol); + vec3 topRightColor = fetch_offset(tli, ivec2(1,0)) * rcol * vec3(tcol); + + vec3 averageColor = topLeftColor + bottomRightColor + bottomLeftColor + topRightColor; + + averageColor = mat3(cred, cgreen, cblue) * averageColor; + + FragColor = vec4(pow(averageColor, vec3(1.0/outgamma)),0.0); +} diff --git a/handheld/lcd-grid-v2-gba-color-motionblur.slangp b/handheld/lcd-grid-v2-gba-color-motionblur.slangp new file mode 100644 index 0000000..b8836cc --- /dev/null +++ b/handheld/lcd-grid-v2-gba-color-motionblur.slangp @@ -0,0 +1,32 @@ +shaders = "3" + +shader0 = "../motionblur/shaders/motionblur-simple.slang" +filter_linear0 = "false" +scale_type0 = "source" +scale0 = "1.0" + +shader1 = "gba-color.slang" +filter_linear1 = "false" +scale_type1 = "source" +scale1 = "1.0" + +shader2 = "lcd-cgwg/lcd-grid-v2.slang" +filter_linear2 = "false" +scale_type2 = "viewport" +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 = "1.000000" +RSUBPIX_G = "0.000000" +RSUBPIX_B = "0.000000" +GSUBPIX_R = "0.000000" +GSUBPIX_G = "1.000000" +GSUBPIX_B = "0.000000" +BSUBPIX_R = "0.000000" +BSUBPIX_G = "0.000000" +BSUBPIX_B = "1.000000" +gain = "1.250000" +gamma = "3.000000" +blacklevel = "0.050000" +ambient = "0.000000" +BGR = "1.000000"