From 7021e612b0ca67d3df06632bf1c00fe7509679ba Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Wed, 8 Aug 2018 21:58:23 +0200 Subject: [PATCH] - add gl_dither for toggling dithered output on and off # Conflicts: # src/gl/renderer/gl_stereo3d.cpp # wadsrc/static/menudef.txt # Conflicts: # src/gl/renderer/gl_postprocess.cpp # src/gl/stereo3d/gl_interleaved3d.cpp # src/hwrenderer/postprocessing/hw_presentshader.h --- src/gl/renderer/gl_postprocess.cpp | 7 +++++++ src/gl/shaders/gl_presentshader.cpp | 1 + src/gl/shaders/gl_presentshader.h | 1 + src/gl/stereo3d/gl_interleaved3d.cpp | 2 ++ wadsrc/static/language.enu | 1 + wadsrc/static/menudef.txt | 1 + wadsrc/static/shaders/glsl/present.fp | 9 ++++++--- 7 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/gl/renderer/gl_postprocess.cpp b/src/gl/renderer/gl_postprocess.cpp index 437d479b9..db15783be 100644 --- a/src/gl/renderer/gl_postprocess.cpp +++ b/src/gl/renderer/gl_postprocess.cpp @@ -157,6 +157,8 @@ EXTERN_CVAR(Float, vid_contrast) EXTERN_CVAR(Float, vid_saturation) EXTERN_CVAR(Int, gl_satformula) +CVAR(Bool, gl_dither, false, CVAR_ARCHIVE | CVAR_GLOBALCONFIG | CVAR_NOINITCALL) + void FGLRenderer::RenderScreenQuad() { mVBO->BindVBO(); @@ -900,6 +902,11 @@ void FGLRenderer::DrawPresentTexture(const GL_IRECT &box, bool applyGamma) // It probably will eventually in desktop mode too, but the DWM doesn't seem to support that. invgamma *= 2.2f; mPresentShader->InvGamma.Set(invgamma); + mPresentShader->ColorScale.Set(static_cast(gl_dither ? 1023.0f : 0.0f)); + } + else + { + mPresentShader->ColorScale.Set(static_cast(gl_dither ? 255.0f : 0.0f)); } mPresentShader->Scale.Set(mScreenViewport.width / (float)mBuffers->GetWidth(), mScreenViewport.height / (float)mBuffers->GetHeight()); RenderScreenQuad(); diff --git a/src/gl/shaders/gl_presentshader.cpp b/src/gl/shaders/gl_presentshader.cpp index 06056f539..f4f8d8d5b 100644 --- a/src/gl/shaders/gl_presentshader.cpp +++ b/src/gl/shaders/gl_presentshader.cpp @@ -49,6 +49,7 @@ void FPresentShaderBase::Init(const char * vtx_shader_name, const char * program Saturation.Init(mShader, "Saturation"); GrayFormula.Init(mShader, "GrayFormula"); Scale.Init(mShader, "UVScale"); + ColorScale.Init(mShader, "ColorScale"); } void FPresentShader::Bind() diff --git a/src/gl/shaders/gl_presentshader.h b/src/gl/shaders/gl_presentshader.h index 377a6a4f2..f20421b81 100644 --- a/src/gl/shaders/gl_presentshader.h +++ b/src/gl/shaders/gl_presentshader.h @@ -15,6 +15,7 @@ public: FBufferedUniform1f Saturation; FBufferedUniform1i GrayFormula; FBufferedUniform2f Scale; + FBufferedUniform1f ColorScale; protected: virtual void Init(const char * vtx_shader_name, const char * program_name); diff --git a/src/gl/stereo3d/gl_interleaved3d.cpp b/src/gl/stereo3d/gl_interleaved3d.cpp index 4729fbf77..96377ff91 100644 --- a/src/gl/stereo3d/gl_interleaved3d.cpp +++ b/src/gl/stereo3d/gl_interleaved3d.cpp @@ -48,6 +48,7 @@ EXTERN_CVAR(Int, gl_satformula) EXTERN_CVAR(Bool, fullscreen) EXTERN_CVAR(Int, win_x) // screen pixel position of left of display window EXTERN_CVAR(Int, win_y) // screen pixel position of top of display window +EXTERN_CVAR(Bool, gl_dither) namespace s3d { @@ -112,6 +113,7 @@ static void prepareInterleavedPresent(FPresentStereoShaderBase& shader) shader.Saturation.Set(clamp(vid_saturation, -15.0f, 15.0f)); shader.GrayFormula.Set(static_cast(gl_satformula)); } + shader.ColorScale.Set(static_cast(gl_dither ? 255.0f : 0.0f)); shader.Scale.Set( GLRenderer->mScreenViewport.width / (float)GLRenderer->mBuffers->GetWidth(), GLRenderer->mScreenViewport.height / (float)GLRenderer->mBuffers->GetHeight()); diff --git a/wadsrc/static/language.enu b/wadsrc/static/language.enu index 50b5a388f..0fb36e0fc 100644 --- a/wadsrc/static/language.enu +++ b/wadsrc/static/language.enu @@ -2769,6 +2769,7 @@ GLPREFMNU_LENS = "Lens distortion effect"; GLPREFMNU_SSAO = "Ambient occlusion quality"; GLPREFMNU_SSAO_PORTALS = "Portals with AO"; GLPREFMNU_FXAA = "FXAA Quality"; +GLPREFMNU_DITHER = "Dither output"; GLPREFMNU_PALTONEMAPORDER = "Tonemap Palette Order"; GLPREFMNU_PALTONEMAPPOWER = "Tonemap Palette Exponent"; GLPREFMNU_SWLMBANDED = "Banded SW Lightmode"; diff --git a/wadsrc/static/menudef.txt b/wadsrc/static/menudef.txt index 355a6b481..cb4ca0e17 100644 --- a/wadsrc/static/menudef.txt +++ b/wadsrc/static/menudef.txt @@ -2548,6 +2548,7 @@ OptionMenu "PostProcessMenu" 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_TONEMAP", gl_tonemap, "TonemapModes" StaticText " " Slider "$GLPREFMNU_PALTONEMAPPOWER", gl_paltonemap_powtable, 0.2, 3.0, 0.1, 1 diff --git a/wadsrc/static/shaders/glsl/present.fp b/wadsrc/static/shaders/glsl/present.fp index 79c33072d..18d4bbea7 100644 --- a/wadsrc/static/shaders/glsl/present.fp +++ b/wadsrc/static/shaders/glsl/present.fp @@ -9,6 +9,7 @@ uniform float Brightness; uniform float Saturation; uniform int GrayFormula; uniform sampler2D DitherTexture; +uniform float ColorScale; vec4 ApplyGamma(vec4 c) { @@ -23,14 +24,16 @@ vec4 ApplyGamma(vec4 c) return vec4(val, c.a); } -vec4 Dither(vec4 c, float colorscale) +vec4 Dither(vec4 c) { + if (ColorScale == 0.0) + return c; vec2 texSize = vec2(textureSize(DitherTexture, 0)); float threshold = texture(DitherTexture, gl_FragCoord.xy / texSize).r; - return vec4(floor(c.rgb * colorscale + threshold) / colorscale, c.a); + return vec4(floor(c.rgb * ColorScale + threshold) / ColorScale, c.a); } void main() { - FragColor = Dither(ApplyGamma(texture(InputTexture, TexCoord)), 255.0); + FragColor = Dither(ApplyGamma(texture(InputTexture, TexCoord))); }