more 'correct' dithering shader code

This commit is contained in:
minjaesong
2023-09-15 15:51:37 +09:00
parent cacef34473
commit 61f0528205
2 changed files with 11 additions and 3 deletions

View File

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

View File

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