From 61f05282053c9f7a17b2d409f19c02dfeee2b790 Mon Sep 17 00:00:00 2001 From: minjaesong Date: Fri, 15 Sep 2023 15:51:37 +0900 Subject: [PATCH] more 'correct' dithering shader code --- src/net/torvald/terrarum/TerrarumPostProcessor.kt | 7 +++++++ src/shaders/postproc_dither.frag | 7 ++++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/net/torvald/terrarum/TerrarumPostProcessor.kt b/src/net/torvald/terrarum/TerrarumPostProcessor.kt index 6bdc63a29..51eeb8ddb 100644 --- a/src/net/torvald/terrarum/TerrarumPostProcessor.kt +++ b/src/net/torvald/terrarum/TerrarumPostProcessor.kt @@ -51,6 +51,10 @@ object TerrarumPostProcessor : Disposable { private val recommendRatio = 1.5f + /*private val testfill = Texture("./assets/test_fill.tga").also { + it.setFilter(Texture.TextureFilter.Linear, Texture.TextureFilter.Linear) + }*/ + private val shaderQuant = mapOf( 8 to 255f, 10 to 1023f, @@ -77,6 +81,7 @@ object TerrarumPostProcessor : Disposable { shaderPostNoDither.dispose() if (::lutTex.isInitialized) lutTex.tryDispose() if (::outFBO.isInitialized) outFBO.dispose() +// testfill.dispose() } private var deltatBenchStr = "ΔF: Gathering data" @@ -239,6 +244,7 @@ object TerrarumPostProcessor : Disposable { App.getCurrentDitherTex().bind(1) fbo.colorBufferTexture.bind(0) +// testfill.bind(0) shader.bind() shader.setUniformMatrix("u_projTrans", projMat) @@ -246,6 +252,7 @@ object TerrarumPostProcessor : Disposable { 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", 1f) shader.setUniformMatrix4fv("swizzler", swizzler, rng.nextInt(24), 16*4) App.fullscreenQuad.render(shader, GL20.GL_TRIANGLE_FAN) diff --git a/src/shaders/postproc_dither.frag b/src/shaders/postproc_dither.frag index 9f593c65c..e520dd139 100644 --- a/src/shaders/postproc_dither.frag +++ b/src/shaders/postproc_dither.frag @@ -37,7 +37,8 @@ vec4 invQuant = vec4(1.0 / quant); out vec4 fragColor; const vec2 boolean = vec2(0.0, 1.0); - +const vec4 halfPulldown = vec4(0.5 / 255.0); // 255.0 comes from the dithering pattern, not the quantiser +const vec4 halfPullUp = vec4(255.0 / 254.5); // 255.0 comes from the dithering pattern, not the quantiser const vec2 patternsize = vec2(1.0/512.0, 1.0/512.0); @@ -46,8 +47,8 @@ vec4 nearestColour(vec4 inColor) { } vec4 getDitherredDot(vec4 inColor) { - vec4 bayerThreshold = swizzler * vec4(texture(u_pattern, (gl_FragCoord.xy + rnd) * patternsize)); - return nearestColour(fma(bayerThreshold, invQuant, inColor)); + vec4 bayerThreshold = swizzler * vec4(texture(u_pattern, (gl_FragCoord.xy + rnd) * patternsize) - halfPulldown); + return nearestColour(fma(bayerThreshold, invQuant, inColor * halfPullUp)); } void main(void) {