temporal dithering test

This commit is contained in:
minjaesong
2021-10-10 01:54:07 +09:00
parent 35b4b5cfd5
commit 036310921f
7 changed files with 28 additions and 12 deletions

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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",

View File

@@ -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())

View File

@@ -37,6 +37,8 @@ internal object WeatherMixer : RNGConsumer {
override val RNG = HQRNG()
private val renderng = HQRNG()
var globalLightOverridden = false
var weatherList: HashMap<String, ArrayList<BaseModularWeather>>
@@ -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
}