From b92b53352b7d16b5b16cc4e39bd361f5db2f76b5 Mon Sep 17 00:00:00 2001 From: minjaesong Date: Tue, 12 Apr 2022 11:16:58 +0900 Subject: [PATCH] more 'correct' dithering equation --- src/net/torvald/terrarum/PostProcessor.kt | 2 +- src/shaders/postproc_dither.frag | 8 +++---- src/shaders/postproc_nodither.frag | 29 +++++++---------------- 3 files changed, 13 insertions(+), 26 deletions(-) diff --git a/src/net/torvald/terrarum/PostProcessor.kt b/src/net/torvald/terrarum/PostProcessor.kt index c5e256a55..cc13d8509 100644 --- a/src/net/torvald/terrarum/PostProcessor.kt +++ b/src/net/torvald/terrarum/PostProcessor.kt @@ -159,7 +159,7 @@ object PostProcessor : Disposable { shader.setUniformi("u_texture", 0) shader.setUniformi("rnd", rng.nextInt(8192), rng.nextInt(8192)) shader.setUniformi("u_pattern", 1) - shader.setUniformf("quant", shaderQuant[App.getConfigInt("displaycolourdepth")] ?: 255f) + shader.setUniformf("quant", 2f)//shaderQuant[App.getConfigInt("displaycolourdepth")] ?: 255f) App.fullscreenQuad.render(shader, GL20.GL_TRIANGLES) diff --git a/src/shaders/postproc_dither.frag b/src/shaders/postproc_dither.frag index b3c70ebc1..fba0bd433 100644 --- a/src/shaders/postproc_dither.frag +++ b/src/shaders/postproc_dither.frag @@ -5,7 +5,7 @@ #version 130 #ifdef GL_ES - precision mediump float; +precision mediump float; #endif @@ -26,7 +26,7 @@ uniform ivec2 rnd = ivec2(0,0); uniform float quant = 255.0; // 64 steps -> 63.0; 256 steps -> 255.0 vec2 boolean = vec2(0.0, 1.0); -vec4 halfvec = vec4(0.5); +vec4 matrixNormaliser = vec4(0.5 / 256.0); vec2 patternsize = vec2(1.0/512.0, 1.0/512.0); @@ -46,11 +46,11 @@ mat4 ycocg_to_rgb = mat4( vec4 nearestColour(vec4 inColor) { - return floor(vec4(quant) * inColor + halfvec) * vec4(1.0 / quant); + return floor(vec4(quant) * inColor) * vec4(1.0 / quant); } vec4 getDitherredDot(vec4 inColor) { - vec4 bayerThreshold = vec4(texture2D(u_pattern, (gl_FragCoord.xy + rnd) * patternsize) - 0.5); + vec4 bayerThreshold = vec4(matrixNormaliser + texture2D(u_pattern, (gl_FragCoord.xy + rnd) * patternsize)); return nearestColour(bayerThreshold * vec4(1.0 / quant) + inColor); } diff --git a/src/shaders/postproc_nodither.frag b/src/shaders/postproc_nodither.frag index fec37c568..d972b4117 100644 --- a/src/shaders/postproc_nodither.frag +++ b/src/shaders/postproc_nodither.frag @@ -26,35 +26,22 @@ uniform ivec2 rnd = ivec2(0,0); uniform float quant = 255.0; // 64 steps -> 63.0; 256 steps -> 255.0 vec2 boolean = vec2(0.0, 1.0); -vec4 halfvec = vec4(0.5); - -vec2 patternsize = vec2(1.0/512.0, 1.0/512.0); mat4 rgb_to_ycocg = mat4( -0.25, 1.0, -0.5, 0.0, -0.5, 0.0, 1.0, 0.0, -0.25, -1.0, -0.5, 0.0, -0.0, 0.0, 0.0, 1.0 + 0.25, 1.0, -0.5, 0.0, + 0.5, 0.0, 1.0, 0.0, + 0.25, -1.0, -0.5, 0.0, + 0.0, 0.0, 0.0, 1.0 ); mat4 ycocg_to_rgb = mat4( -1.0, 1.0, 1.0, 0.0, -0.5, 0.0, -0.5, 0.0, --0.5, 0.5, -0.5, 0.0, -0.0, 0.0, 0.0, 1.0 + 1.0, 1.0, 1.0, 0.0, + 0.5, 0.0, -0.5, 0.0, + -0.5, 0.5, -0.5, 0.0, + 0.0, 0.0, 0.0, 1.0 ); -vec4 nearestColour(vec4 inColor) { - return floor(vec4(quant) * inColor + halfvec) * vec4(1.0 / quant); -} - -vec4 getDitherredDot(vec4 inColor) { - vec4 bayerThreshold = vec4(texture2D(u_pattern, (gl_FragCoord.xy + rnd) * patternsize) - 0.5); - return nearestColour(bayerThreshold * vec4(1.0 / quant) + inColor); -} - - uniform vec4 vibrancy = vec4(1.0);//vec4(1.0, 1.4, 1.2, 1.0); void main(void) {