From 036310921f6356038a94b2e28556c29d09f781df Mon Sep 17 00:00:00 2001 From: minjaesong Date: Sun, 10 Oct 2021 01:54:07 +0900 Subject: [PATCH] temporal dithering test --- assets/4096_bayer.frag | 7 ++++--- assets/4096_bayer_aaa1.frag | 7 ++++--- assets/4096_bayer_rgb1.frag | 7 ++++--- assets/blur_dither.frag | 7 ++++--- src/net/torvald/terrarum/modulebasegame/IngameRenderer.kt | 6 ++++++ src/net/torvald/terrarum/ui/Toolkit.kt | 3 +++ src/net/torvald/terrarum/weather/WeatherMixer.kt | 3 +++ 7 files changed, 28 insertions(+), 12 deletions(-) diff --git a/assets/4096_bayer.frag b/assets/4096_bayer.frag index 7b24de03e..09e314ece 100644 --- a/assets/4096_bayer.frag +++ b/assets/4096_bayer.frag @@ -21,8 +21,9 @@ varying vec4 v_color; varying vec2 v_texCoords; uniform sampler2D u_texture; uniform sampler2D u_pattern; +uniform ivec2 rnd = ivec2(0,0); -float quant = 63.0; // 64 steps -> 63.0; 256 steps -> 255.0 +float quant = 127.0; // 64 steps -> 63.0; 256 steps -> 255.0 vec4 quantiser = vec4(quant); vec4 quantiserDivider = vec4(1.0 / quant); @@ -36,8 +37,8 @@ vec4 nearestColour(vec4 inColor) { } vec4 getDitherredDot(vec4 inColor) { - vec4 bayerThreshold = vec4(texture2D(u_pattern, gl_FragCoord.xy * patternsize) - 0.5); - return nearestColour(inColor + bayerThreshold * quantiserDivider); + vec4 bayerThreshold = vec4(texture2D(u_pattern, (gl_FragCoord.xy + rnd) * patternsize) - 0.5); + return nearestColour(bayerThreshold * quantiserDivider + inColor); } diff --git a/assets/4096_bayer_aaa1.frag b/assets/4096_bayer_aaa1.frag index d41149a3f..63f90a49b 100644 --- a/assets/4096_bayer_aaa1.frag +++ b/assets/4096_bayer_aaa1.frag @@ -13,8 +13,9 @@ varying vec4 v_color; varying vec2 v_texCoords; uniform sampler2D u_texture; uniform sampler2D u_pattern; +uniform ivec2 rnd = ivec2(0,0); -float quant = 63.0; // 64 steps -> 63.0; 256 steps -> 255.0 +float quant = 127.0; // 64 steps -> 63.0; 256 steps -> 255.0 vec4 quantiser = vec4(quant); vec4 quantiserDivider = vec4(1.0 / quant); @@ -28,8 +29,8 @@ vec4 nearestColour(vec4 inColor) { } vec4 getDitherredDot(vec4 inColor) { - vec4 bayerThreshold = vec4(texture2D(u_pattern, gl_FragCoord.xy * patternsize) - 0.5); - return nearestColour(inColor + bayerThreshold * quantiserDivider); + vec4 bayerThreshold = vec4(texture2D(u_pattern, (gl_FragCoord.xy + rnd) * patternsize) - 0.5); + return nearestColour(bayerThreshold * quantiserDivider + inColor); } diff --git a/assets/4096_bayer_rgb1.frag b/assets/4096_bayer_rgb1.frag index 1d5974878..2aa8a1b6f 100644 --- a/assets/4096_bayer_rgb1.frag +++ b/assets/4096_bayer_rgb1.frag @@ -13,8 +13,9 @@ varying vec4 v_color; varying vec2 v_texCoords; uniform sampler2D u_texture; uniform sampler2D u_pattern; +uniform ivec2 rnd = ivec2(0,0); -float quant = 63.0; // 64 steps -> 63.0; 256 steps -> 255.0 +float quant = 127.0; // 64 steps -> 63.0; 256 steps -> 255.0 vec4 quantiser = vec4(quant); vec4 quantiserDivider = vec4(1.0 / quant); @@ -28,8 +29,8 @@ vec4 nearestColour(vec4 inColor) { } vec4 getDitherredDot(vec4 inColor) { - vec4 bayerThreshold = vec4(texture2D(u_pattern, gl_FragCoord.xy * patternsize) - 0.5); - return nearestColour(inColor + bayerThreshold * quantiserDivider); + vec4 bayerThreshold = vec4(texture2D(u_pattern, (gl_FragCoord.xy + rnd) * patternsize) - 0.5); + return nearestColour(bayerThreshold * quantiserDivider + inColor); } diff --git a/assets/blur_dither.frag b/assets/blur_dither.frag index 6dc06ad3d..b2c14a13e 100644 --- a/assets/blur_dither.frag +++ b/assets/blur_dither.frag @@ -11,8 +11,9 @@ varying vec4 v_color; varying vec2 v_texCoords; uniform sampler2D u_texture; uniform sampler2D u_pattern; +uniform ivec2 rnd = ivec2(0,0); -float quant = 63.0; // 64 steps -> 63.0; 256 steps -> 255.0 +float quant = 127.0; // 64 steps -> 63.0; 256 steps -> 255.0 vec4 quantiser = vec4(quant); vec4 quantiserDivider = vec4(1.0 / quant); @@ -26,8 +27,8 @@ vec4 nearestColour(vec4 inColor) { } vec4 getDitherredDot(vec4 inColor) { - vec4 bayerThreshold = vec4(texture2D(u_pattern, gl_FragCoord.xy * patternsize) - 0.5); - return nearestColour(inColor + bayerThreshold * quantiserDivider); + vec4 bayerThreshold = vec4(texture2D(u_pattern, (gl_FragCoord.xy + rnd) * patternsize) - 0.5); + return nearestColour(bayerThreshold * quantiserDivider + inColor); } diff --git a/src/net/torvald/terrarum/modulebasegame/IngameRenderer.kt b/src/net/torvald/terrarum/modulebasegame/IngameRenderer.kt index e3598e9d1..eaa88fd2c 100644 --- a/src/net/torvald/terrarum/modulebasegame/IngameRenderer.kt +++ b/src/net/torvald/terrarum/modulebasegame/IngameRenderer.kt @@ -8,6 +8,7 @@ import com.badlogic.gdx.graphics.g2d.TextureRegion import com.badlogic.gdx.graphics.glutils.FrameBuffer import com.badlogic.gdx.graphics.glutils.ShaderProgram import com.badlogic.gdx.utils.Disposable +import net.torvald.random.HQRNG import net.torvald.terrarum.* import net.torvald.terrarum.App.measureDebugTime import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZE @@ -66,6 +67,8 @@ object IngameRenderer : Disposable { inline fun isDither() = App.getConfigBoolean("fx_dither") + private val rng = HQRNG() + val shaderBlur: ShaderProgram get() = if (isDither()) shaderBlurDither else shaderBlurRaw val shaderRGBOnly: ShaderProgram @@ -496,6 +499,7 @@ object IngameRenderer : Disposable { blendMul(batch) batch.shader = shaderRGBOnly + batch.shader.setUniformi("rnd", rng.nextInt(8192), rng.nextInt(8192)) batch.shader.setUniformi("u_pattern", 1) batch.draw(lightTex, xrem, yrem, @@ -581,6 +585,7 @@ object IngameRenderer : Disposable { blendMul(batch) batch.shader = shaderAtoGrey + batch.shader.setUniformi("rnd", rng.nextInt(8192), rng.nextInt(8192)) batch.shader.setUniformi("u_pattern", 1) batch.draw(lightTex, xrem, yrem, @@ -687,6 +692,7 @@ object IngameRenderer : Disposable { shaderBlur.bind() shaderBlur.setUniformMatrix("u_projTrans", camera.combined) + shaderBlur.setUniformi("rnd", rng.nextInt(8192), rng.nextInt(8192)) shaderBlur.setUniformi("u_pattern", 1) shaderBlur.setUniformi("u_texture", 0) shaderBlur.setUniformf("iResolution", diff --git a/src/net/torvald/terrarum/ui/Toolkit.kt b/src/net/torvald/terrarum/ui/Toolkit.kt index b9b6168bb..96036973b 100644 --- a/src/net/torvald/terrarum/ui/Toolkit.kt +++ b/src/net/torvald/terrarum/ui/Toolkit.kt @@ -9,6 +9,7 @@ import com.badlogic.gdx.graphics.g2d.SpriteBatch import com.badlogic.gdx.graphics.g2d.TextureRegion import com.badlogic.gdx.graphics.glutils.ShaderProgram import com.badlogic.gdx.utils.Disposable +import net.torvald.random.HQRNG import net.torvald.terrarum.App import net.torvald.terrarum.CommonResourcePool import net.torvald.terrarum.fillRect @@ -39,6 +40,7 @@ object Toolkit : Disposable { CommonResourcePool.loadAll() } + private val rng = HQRNG() override fun dispose() { baloonTile.dispose() @@ -114,6 +116,7 @@ object Toolkit : Disposable { batch.shader = shaderBlur shaderBlur.setUniformMatrix("u_projTrans", camera.combined) + shaderBlur.setUniformi("rnd", rng.nextInt(8192), rng.nextInt(8192)) shaderBlur.setUniformi("u_texture", 0) shaderBlur.setUniformi("u_pattern", 1) shaderBlur.setUniformf("iResolution", w.toFloat(), h.toFloat()) diff --git a/src/net/torvald/terrarum/weather/WeatherMixer.kt b/src/net/torvald/terrarum/weather/WeatherMixer.kt index 4760603ed..8fbf16af9 100644 --- a/src/net/torvald/terrarum/weather/WeatherMixer.kt +++ b/src/net/torvald/terrarum/weather/WeatherMixer.kt @@ -37,6 +37,8 @@ internal object WeatherMixer : RNGConsumer { override val RNG = HQRNG() + private val renderng = HQRNG() + var globalLightOverridden = false var weatherList: HashMap> @@ -186,6 +188,7 @@ internal object WeatherMixer : RNGConsumer { it.shader = if (App.getConfigBoolean("fx_dither")) IngameRenderer.shaderBayer else null if (App.getConfigBoolean("fx_dither")) { it.shader.setUniformi("u_pattern", 1) + it.shader.setUniformi("rnd", renderng.nextInt(8192), renderng.nextInt(8192)) } it.draw(skyboxTexture, 0f, -App.scr.halfhf, App.scr.wf, App.scr.hf * 2f) // because of how the linear filter works, we extend the image by two }