From 63da6e70c0d4f2bbd05186cd14e781c6def9d208 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Sun, 25 Jun 2017 19:33:07 -0400 Subject: [PATCH] - added a vid_saturation control - works in postprocessing, only. --- src/gl/renderer/gl_postprocess.cpp | 3 +++ src/gl/shaders/gl_presentshader.cpp | 1 + src/gl/shaders/gl_presentshader.h | 1 + src/gl/stereo3d/gl_interleaved3d.cpp | 2 ++ src/gl/system/gl_menu.cpp | 8 ++++++++ wadsrc/static/shaders/glsl/present.fp | 4 +++- 6 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/gl/renderer/gl_postprocess.cpp b/src/gl/renderer/gl_postprocess.cpp index acc0a08b4..92dd0bc80 100644 --- a/src/gl/renderer/gl_postprocess.cpp +++ b/src/gl/renderer/gl_postprocess.cpp @@ -149,6 +149,7 @@ CVAR(Float, gl_menu_blur, -1.0f, CVAR_ARCHIVE) EXTERN_CVAR(Float, vid_brightness) EXTERN_CVAR(Float, vid_contrast) +EXTERN_CVAR(Float, vid_saturation) void FGLRenderer::RenderScreenQuad() @@ -858,12 +859,14 @@ void FGLRenderer::DrawPresentTexture(const GL_IRECT &box, bool applyGamma) mPresentShader->InvGamma.Set(1.0f); mPresentShader->Contrast.Set(1.0f); mPresentShader->Brightness.Set(0.0f); + mPresentShader->Saturation.Set(1.0f); } else { mPresentShader->InvGamma.Set(1.0f / clamp(Gamma, 0.1f, 4.f)); mPresentShader->Contrast.Set(clamp(vid_contrast, 0.1f, 3.f)); mPresentShader->Brightness.Set(clamp(vid_brightness, -0.8f, 0.8f)); + mPresentShader->Saturation.Set(clamp(vid_saturation, -3.0f, 3.f)); } 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 5fe040db9..8fdf623d9 100644 --- a/src/gl/shaders/gl_presentshader.cpp +++ b/src/gl/shaders/gl_presentshader.cpp @@ -46,6 +46,7 @@ void FPresentShaderBase::Init(const char * vtx_shader_name, const char * program InvGamma.Init(mShader, "InvGamma"); Contrast.Init(mShader, "Contrast"); Brightness.Init(mShader, "Brightness"); + Saturation.Init(mShader, "Saturation"); Scale.Init(mShader, "UVScale"); } diff --git a/src/gl/shaders/gl_presentshader.h b/src/gl/shaders/gl_presentshader.h index dcf42cdf8..acb3f50eb 100644 --- a/src/gl/shaders/gl_presentshader.h +++ b/src/gl/shaders/gl_presentshader.h @@ -12,6 +12,7 @@ public: FBufferedUniform1f InvGamma; FBufferedUniform1f Contrast; FBufferedUniform1f Brightness; + FBufferedUniform1f Saturation; FBufferedUniform2f Scale; protected: diff --git a/src/gl/stereo3d/gl_interleaved3d.cpp b/src/gl/stereo3d/gl_interleaved3d.cpp index 40aed85a9..686802e6a 100644 --- a/src/gl/stereo3d/gl_interleaved3d.cpp +++ b/src/gl/stereo3d/gl_interleaved3d.cpp @@ -41,6 +41,7 @@ #include "gl/system/gl_framebuffer.h" #include "gl/shaders/gl_present3dRowshader.h" +EXTERN_CVAR(Float, vid_saturation) EXTERN_CVAR(Float, vid_brightness) EXTERN_CVAR(Float, vid_contrast) EXTERN_CVAR(Bool, fullscreen) @@ -106,6 +107,7 @@ static void prepareInterleavedPresent(FPresentStereoShaderBase& shader) shader.InvGamma.Set(1.0f / clamp(Gamma, 0.1f, 4.f)); shader.Contrast.Set(clamp(vid_contrast, 0.1f, 3.f)); shader.Brightness.Set(clamp(vid_brightness, -0.8f, 0.8f)); + shader.Saturation.Set(clamp(vid_saturation, -3.0f, 3.0f)); } shader.Scale.Set( GLRenderer->mScreenViewport.width / (float)GLRenderer->mBuffers->GetWidth(), diff --git a/src/gl/system/gl_menu.cpp b/src/gl/system/gl_menu.cpp index 8dffbc4f2..5813613b4 100644 --- a/src/gl/system/gl_menu.cpp +++ b/src/gl/system/gl_menu.cpp @@ -73,6 +73,14 @@ CUSTOM_CVAR (Float, vid_contrast, 1.f, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) } } +CUSTOM_CVAR (Float, vid_saturation, 1.f, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) +{ + if (screen != NULL) + { + screen->SetGamma(Gamma); //SetContrast (self); + } +} + // Do some tinkering with the menus so that certain options only appear // when they are actually valid. diff --git a/wadsrc/static/shaders/glsl/present.fp b/wadsrc/static/shaders/glsl/present.fp index 31c1217cb..3683d6bd1 100644 --- a/wadsrc/static/shaders/glsl/present.fp +++ b/wadsrc/static/shaders/glsl/present.fp @@ -6,10 +6,12 @@ uniform sampler2D InputTexture; uniform float InvGamma; uniform float Contrast; uniform float Brightness; +uniform float Saturation; vec4 ApplyGamma(vec4 c) { - vec3 val = c.rgb * Contrast - (Contrast - 1.0) * 0.5; + vec3 valgray = (0.3 * c.r + 0.59 * c.g + 0.11 * c.b) * (1 - Saturation) + c.rgb * Saturation; + vec3 val = valgray * Contrast - (Contrast - 1.0) * 0.5; val += Brightness * 0.5; val = pow(max(val, vec3(0.0)), vec3(InvGamma)); return vec4(val, c.a);