From ecdc485e05dd95515cff30ea56fcfcd8a5be82e8 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Thu, 9 Aug 2018 15:13:26 -0400 Subject: [PATCH] - Allow specifying monitor bits-per-channel for dithering output. Not all displays are created equal, so this option is actually important for specifying the exact amount for your display. --- src/gl/renderer/gl_postprocess.cpp | 6 +++--- src/gl/renderer/gl_stereo3d.cpp | 4 ++-- wadsrc/static/menudef.txt | 11 ++++++++++- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/gl/renderer/gl_postprocess.cpp b/src/gl/renderer/gl_postprocess.cpp index 0ae3a6db3..9edd43c2a 100644 --- a/src/gl/renderer/gl_postprocess.cpp +++ b/src/gl/renderer/gl_postprocess.cpp @@ -49,7 +49,7 @@ extern bool vid_hdr_active; -CVAR(Bool, gl_dither, false, CVAR_ARCHIVE | CVAR_GLOBALCONFIG | CVAR_NOINITCALL) +CVAR(Int, gl_dither_bpc, 0, CVAR_ARCHIVE | CVAR_GLOBALCONFIG | CVAR_NOINITCALL) void FGLRenderer::RenderScreenQuad() { @@ -236,11 +236,11 @@ void FGLRenderer::DrawPresentTexture(const IntRect &box, bool applyGamma) // Full screen exclusive mode treats a rgba16f frame buffer as linear. // It probably will eventually in desktop mode too, but the DWM doesn't seem to support that. mPresentShader->Uniforms->InvGamma *= 2.2f; - mPresentShader->Uniforms->ColorScale = gl_dither ? 1023.0f : 0.0f; + mPresentShader->Uniforms->ColorScale = (gl_dither_bpc == -1) ? 1023.0f : (float)(1 << gl_dither_bpc - 1); } else { - mPresentShader->Uniforms->ColorScale = gl_dither ? 255.0f : 0.0f; + mPresentShader->Uniforms->ColorScale = (gl_dither_bpc == -1) ? 255.0f : (float)(1 << gl_dither_bpc - 1); } mPresentShader->Uniforms->Scale = { screen->mScreenViewport.width / (float)mBuffers->GetWidth(), screen->mScreenViewport.height / (float)mBuffers->GetHeight() }; mPresentShader->Uniforms.Set(); diff --git a/src/gl/renderer/gl_stereo3d.cpp b/src/gl/renderer/gl_stereo3d.cpp index 6bf7a80db..829dbb1f1 100644 --- a/src/gl/renderer/gl_stereo3d.cpp +++ b/src/gl/renderer/gl_stereo3d.cpp @@ -39,7 +39,7 @@ EXTERN_CVAR(Float, vid_saturation) EXTERN_CVAR(Float, vid_brightness) EXTERN_CVAR(Float, vid_contrast) EXTERN_CVAR(Int, gl_satformula) -EXTERN_CVAR(Bool, gl_dither) +EXTERN_CVAR(Int, gl_dither_bpc) //========================================================================== // @@ -163,7 +163,7 @@ static void prepareInterleavedPresent(FPresentShaderBase& shader) shader.Uniforms->Saturation = clamp(vid_saturation, -15.0f, 15.0f); shader.Uniforms->GrayFormula = static_cast(gl_satformula); } - shader.Uniforms->ColorScale = gl_dither ? 255.0f : 0.0f; + shader.Uniforms->ColorScale = (gl_dither_bpc == -1) ? 255.0f : (float)(1 << gl_dither_bpc - 1); shader.Uniforms->Scale = { screen->mScreenViewport.width / (float)GLRenderer->mBuffers->GetWidth(), screen->mScreenViewport.height / (float)GLRenderer->mBuffers->GetHeight() diff --git a/wadsrc/static/menudef.txt b/wadsrc/static/menudef.txt index b4c23003e..f83a65fd9 100644 --- a/wadsrc/static/menudef.txt +++ b/wadsrc/static/menudef.txt @@ -2105,6 +2105,15 @@ OptionValue "Precision" 1, "$OPTVAL_QUALITY" } +OptionValue "DitherModes" +{ + 0, "$OPTVAL_OFF" + -1, "$OPTVAL_ON" + 6, "6 BPC" + 8, "8 BPC" + 10, "10 BPC" + 12, "12 BPC" +} OptionValue "Hz" { @@ -2286,7 +2295,7 @@ OptionMenu "OpenGLOptions" protected Option "$GLPREFMNU_SSAO", gl_ssao, "SSAOModes" Slider "$GLPREFMNU_SSAO_PORTALS", gl_ssao_portals, 0.0, 4.0, 1.0, 0 Option "$GLPREFMNU_FXAA", gl_fxaa, "FXAAQuality" - Option "$GLPREFMNU_DITHER", gl_dither, "OnOff" + Option "$GLPREFMNU_DITHER", gl_dither_bpc, "DitherModes" StaticText " " Slider "$GLPREFMNU_PALTONEMAPPOWER", gl_paltonemap_powtable, 0.2, 3.0, 0.1, 1 Option "$GLPREFMNU_PALTONEMAPORDER", gl_paltonemap_reverselookup, "LookupOrder"