From 150608a989dfe5ad09b1518fd91583cb3ff5188d Mon Sep 17 00:00:00 2001 From: Hyllian Date: Thu, 29 Sep 2022 08:29:19 -0300 Subject: [PATCH] Update ddt shaders - Better dithering treatment for ddt-xbr-lv1 and ddt-jinc; - Delete ddt-sharp as it's just a clone of ddt.slang. --- ddt/shaders/ddt-jinc.slang | 6 +- ddt/shaders/ddt-sharp.slang | 177 ---------------------------------- ddt/shaders/ddt-xbr-lv1.slang | 13 +-- 3 files changed, 10 insertions(+), 186 deletions(-) delete mode 100644 ddt/shaders/ddt-sharp.slang diff --git a/ddt/shaders/ddt-jinc.slang b/ddt/shaders/ddt-jinc.slang index 0fba964..905e47f 100644 --- a/ddt/shaders/ddt-jinc.slang +++ b/ddt/shaders/ddt-jinc.slang @@ -50,7 +50,7 @@ layout(push_constant) uniform Push #pragma parameter JINC2_AR_STRENGTH "Anti-ringing Strength" 1.0 0.0 1.0 0.1 #define JINC2_AR_STRENGTH params.JINC2_AR_STRENGTH -#pragma parameter DDT_THRESHOLD "DDT Diagonal Threshold" 3.0 1.0 6.0 0.2 +#pragma parameter DDT_THRESHOLD "DDT Diagonal Threshold" 2.6 1.0 6.0 0.2 #define DDT_THRESHOLD params.DDT_THRESHOLD layout(std140, set = 0, binding = 0) uniform UBO @@ -193,7 +193,7 @@ void main() float irlv1 = (abs(a-b)+abs(a-c)+abs(a-d)); - if ((wd1*DDT_THRESHOLD < wd2) && (irlv1 > 0.0)) + if (((wd1+0.1*DDT_THRESHOLD)*DDT_THRESHOLD < wd2) && (irlv1 > 0.0)) { if (q <= p) { @@ -210,7 +210,7 @@ void main() c30 = c31 + c20 - c21; } } - else if ((wd1 > wd2*DDT_THRESHOLD) && (irlv1 > 0.0)) + else if ((wd1 > (wd2+0.1*DDT_THRESHOLD)*DDT_THRESHOLD) && (irlv1 > 0.0)) { if ((p+q) < 1.0) { diff --git a/ddt/shaders/ddt-sharp.slang b/ddt/shaders/ddt-sharp.slang deleted file mode 100644 index f9991d5..0000000 --- a/ddt/shaders/ddt-sharp.slang +++ /dev/null @@ -1,177 +0,0 @@ -#version 450 - -/* - Hyllian's DDT Sharp Shader - - Copyright (C) 2011-2016 Hyllian/Jararaca - sergiogdb@gmail.com - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. -*/ - -layout(push_constant) uniform Push -{ - vec4 SourceSize; - vec4 OriginalSize; - vec4 OutputSize; - uint FrameCount; -} params; - -layout(std140, set = 0, binding = 0) uniform UBO -{ - mat4 MVP; -} global; - -#define saturate(c) clamp(c, 0.0, 1.0) -#define lerp(a,b,c) mix(a,b,c) -#define mul(a,b) (b*a) -#define fmod(c,d) mod(c,d) -#define frac(c) fract(c) -#define tex2D(c,d) texture(c,d) -#define float2 vec2 -#define float3 vec3 -#define float4 vec4 -#define int2 ivec2 -#define int3 ivec3 -#define int4 ivec4 -#define bool2 bvec2 -#define bool3 bvec3 -#define bool4 bvec4 -#define float2x2 mat2x2 -#define float3x3 mat3x3 -#define float4x4 mat4x4 - -#define decal Source - -#define WP1 1.0 -#define WP2 1.0 -#define WP3 -1.0 - -const float3 Y = float3(.2126, .7152, .0722); - -float luma(float3 color) -{ - return dot(color, Y); -} - -float3 bilinear(float p, float q, float3 A, float3 B, float3 C, float3 D) -{ - return ((1-p)*(1-q)*A + p*(1-q)*B + (1-p)*q*C + p*q*D); -} - -#pragma stage vertex -layout(location = 0) in vec4 Position; -layout(location = 1) in vec2 TexCoord; -layout(location = 0) out vec2 vTexCoord; -layout(location = 1) out vec4 t1; -layout(location = 2) out vec2 loc; - -void main() -{ - gl_Position = global.MVP * Position; - vTexCoord = TexCoord * 1.0001; - - float2 ps = float2(params.SourceSize.z, params.SourceSize.w); - float dx = ps.x; - float dy = ps.y; - - t1.xy = float2( dx, 0); // F - t1.zw = float2( 0, dy); // H - loc = vTexCoord*params.SourceSize.xy; -} - -#pragma stage fragment -layout(location = 0) in vec2 vTexCoord; -layout(location = 1) in vec4 t1; -layout(location = 2) in vec2 loc; -layout(location = 0) out vec4 FragColor; -layout(set = 0, binding = 2) uniform sampler2D Source; - -void main() -{ - float2 pos = frac(loc)-float2(0.5, 0.5); // pos = pixel position - float2 dir = sign(pos); // dir = pixel direction - - float2 g1 = dir*t1.xy; - float2 g2 = dir*t1.zw; - -// A1 B1 -// A0 A B B2 -// C0 C D D2 -// C3 D3 - - float3 A = tex2D(decal, vTexCoord ).xyz; - float3 B = tex2D(decal, vTexCoord +g1 ).xyz; - float3 C = tex2D(decal, vTexCoord +g2).xyz; - float3 D = tex2D(decal, vTexCoord +g1+g2).xyz; - - float3 A1 = tex2D(decal, vTexCoord -g2).xyz; - float3 B1 = tex2D(decal, vTexCoord +g1-g2).xyz; - float3 A0 = tex2D(decal, vTexCoord -g1 ).xyz; - float3 C0 = tex2D(decal, vTexCoord -g1+g2).xyz; - - float3 B2 = tex2D(decal, vTexCoord +2*g1 ).xyz; - float3 D2 = tex2D(decal, vTexCoord +2*g1+ g2).xyz; - float3 C3 = tex2D(decal, vTexCoord +2*g2).xyz; - float3 D3 = tex2D(decal, vTexCoord +g1+2*g2).xyz; - - float a = luma(A); - float b = luma(B); - float c = luma(C); - float d = luma(D); - - - float a1 = luma(A1); - float b1 = luma(B1); - float a0 = luma(A0); - float c0 = luma(C0); - - float b2 = luma(B2); - float d2 = luma(D2); - float c3 = luma(C3); - float d3 = luma(D3); - - float p = abs(pos.x); - float q = abs(pos.y); - - float k = distance(pos,g1 * params.SourceSize.xy); - float l = distance(pos,g2 * params.SourceSize.xy); - - float wd1 = abs(a-d); - float wd2 = abs(b-c); - - if ( wd1 < wd2 ) - { - if (k < l) - { - C = A + D - B; - } - else - { - B = A + D - C; - } - } - else if (wd1 > wd2) - { - D = B + C - A; - } - - float3 color = bilinear(p, q, A, B, C, D); - - FragColor = vec4(color, 1.0); -} diff --git a/ddt/shaders/ddt-xbr-lv1.slang b/ddt/shaders/ddt-xbr-lv1.slang index f60a9eb..3cb3b6c 100644 --- a/ddt/shaders/ddt-xbr-lv1.slang +++ b/ddt/shaders/ddt-xbr-lv1.slang @@ -39,9 +39,7 @@ layout(push_constant) uniform Push float DYNAMIC_SHARPNESS_MIN; float DYNAMIC_SHARPNESS_MAX; float STATIC_SHARPNESS; - float WP1; - float WP2; - float WP3; + float DDT_THRESHOLD; } params; // set to 1.0 to use dynamic sharpening #pragma parameter USE_DYNAMIC_SHARPNESS "Dynamic Sharpness [ 0FF | ON ]" 1.0 0.0 1.0 1.0 @@ -53,16 +51,19 @@ layout(push_constant) uniform Push #pragma parameter DYNAMIC_SHARPNESS_MIN "Dynamic Sharpness Min" 0.0 0.0 1.0 0.1 // Maximum amount of sharpening in range [0.0, 1.0] -#pragma parameter DYNAMIC_SHARPNESS_MAX "Dynamic Sharpness Max" 0.6 0.0 1.0 0.1 +#pragma parameter DYNAMIC_SHARPNESS_MAX "Dynamic Sharpness Max" 0.3 0.0 1.0 0.1 // If USE_DYNAMIC_SHARPNESS is 0 apply this static sharpness #pragma parameter STATIC_SHARPNESS "Static Sharpness" 0.5 0.0 1.0 0.1 +#pragma parameter DDT_THRESHOLD "DDT Diagonal Threshold" 2.6 1.0 6.0 0.2 + #define USE_DYNAMIC_SHARPNESS params.USE_DYNAMIC_SHARPNESS #define USE_SHARPENING_BIAS params.USE_SHARPENING_BIAS #define DYNAMIC_SHARPNESS_MIN (params.DYNAMIC_SHARPNESS_MIN * 0.5) #define DYNAMIC_SHARPNESS_MAX (params.DYNAMIC_SHARPNESS_MAX * 0.5) #define STATIC_SHARPNESS (params.STATIC_SHARPNESS * 0.5) +#define DDT_THRESHOLD params.DDT_THRESHOLD #define WP1 4.0 #define WP2 1.0 @@ -231,11 +232,11 @@ void main() vec3 color; - if ( (wd1*3.0 < wd2) && (irlv1 > 0.0) ) + if ( ((wd1+0.1*DDT_THRESHOLD)*DDT_THRESHOLD < wd2) && (irlv1 > 0.0) ) { color = triangleInterpolate(B, D, C, A, vec2(q, 1-p), sharpness); } - else if ( (wd1 > wd2*3.0) && (irlv1 > 0.0)) + else if ( (wd1 > (wd2+0.1*DDT_THRESHOLD)*DDT_THRESHOLD) && (irlv1 > 0.0)) { color = triangleInterpolate(A, B, D, C, vec2(p, q), sharpness); }