From af60fcb7099a30c37d37dbe1355a24bb524d32d8 Mon Sep 17 00:00:00 2001 From: Samuel Skiff Date: Tue, 30 Aug 2022 01:34:30 -0500 Subject: [PATCH] Bloom Tweaks (& Improvements, Thanks yeaf!) --- .../postFX/scripts/Bloom/BloomPostFX.tscript | 38 +++++++++---------- .../postFX/scripts/Bloom/bloomStrengthP.hlsl | 3 +- .../postFX/scripts/Bloom/bloomThresholdP.hlsl | 7 +++- .../scripts/Bloom/gl/bloomStrengthP.glsl | 3 +- .../scripts/Bloom/gl/bloomThresholdP.glsl | 7 +++- .../core/rendering/shaders/gl/torque.glsl | 2 +- 6 files changed, 36 insertions(+), 24 deletions(-) diff --git a/Templates/BaseGame/game/core/postFX/scripts/Bloom/BloomPostFX.tscript b/Templates/BaseGame/game/core/postFX/scripts/Bloom/BloomPostFX.tscript index f7416b8a6..a657ae884 100644 --- a/Templates/BaseGame/game/core/postFX/scripts/Bloom/BloomPostFX.tscript +++ b/Templates/BaseGame/game/core/postFX/scripts/Bloom/BloomPostFX.tscript @@ -23,8 +23,8 @@ // Inspired by bloom described in paper listed here: // http://www.iryoku.com/next-generation-post-processing-in-call-of-duty-advanced-warfare -$PostFX::BloomPostFX::threshold = 0.65; -$PostFX::BloomPostFX::intensity = 0.5; +$PostFX::BloomPostFX::threshold = 0.75; +$PostFX::BloomPostFX::intensity = 1.0; $PostFX::BloomPostFX::radius = 4.0; $PostFX::BloomPostFX::dirtEnabled = true; @@ -35,7 +35,7 @@ $PostFX::BloomPostFX::dirtEdgeMaxDist = 0.75; $PostFX::BloomPostFX::dirtEdgeMinVal = 0.05; $PostFX::BloomPostFX::dirtImage = "core/postFX/images/lensDirt.png"; -singleton ShaderData( PFX_BloomThreshold_Shader ) +singleton ShaderData( Bloom_ThresholdShader ) { DXVertexShaderFile = $Core::CommonShaderPath @ "/postFX/postFxV.hlsl"; DXPixelShaderFile = "./bloomThresholdP.hlsl"; @@ -47,7 +47,7 @@ singleton ShaderData( PFX_BloomThreshold_Shader ) pixVersion = 3.0; }; -singleton ShaderData( PFX_BloomDownSample_Shader ) +singleton ShaderData( Bloom_DownSampleShader ) { DXVertexShaderFile = $Core::CommonShaderPath @ "/postFX/postFxV.hlsl"; DXPixelShaderFile = "./downSampleP.hlsl"; @@ -59,7 +59,7 @@ singleton ShaderData( PFX_BloomDownSample_Shader ) pixVersion = 3.0; }; -singleton ShaderData( PFX_BloomUpSample_Shader ) +singleton ShaderData( Bloom_UpSampleShader ) { DXVertexShaderFile = $Core::CommonShaderPath @ "/postFX/postFxV.hlsl"; DXPixelShaderFile = "./upSampleP.hlsl"; @@ -72,7 +72,7 @@ singleton ShaderData( PFX_BloomUpSample_Shader ) pixVersion = 3.0; }; -singleton ShaderData( PFX_BloomStrength_Shader ) +singleton ShaderData( Bloom_StrengthShader ) { DXVertexShaderFile = $Core::CommonShaderPath @ "/postFX/postFxV.hlsl"; DXPixelShaderFile = "./bloomStrengthP.hlsl"; @@ -85,14 +85,14 @@ singleton ShaderData( PFX_BloomStrength_Shader ) pixVersion = 3.0; }; -singleton GFXStateBlockData( BloomPostFX_SampleStateBlock : PFX_DefaultStateBlock ) +singleton GFXStateBlockData( Bloom_SampleStateBlock : PFX_DefaultStateBlock ) { samplersDefined = true; samplerStates[0] = SamplerClampLinear; samplerStates[1] = SamplerClampLinear; }; -singleton GFXStateBlockData( BloomPostFX_Add_SampleStateBlock : PFX_DefaultStateBlock ) +singleton GFXStateBlockData( Bloom_Add_SampleStateBlock : PFX_DefaultStateBlock ) { // Do a one to one blend. blendDefined = true; @@ -164,8 +164,8 @@ function BloomPostFX::SetupBlurFX( %this ) { internalName = "bloomBlur"; allowReflectPass = false; - shader = PFX_BloomDownSample_Shader; - stateBlock = BloomPostFX_SampleStateBlock; + shader = Bloom_DownSampleShader; + stateBlock = Bloom_SampleStateBlock; texture[0] = "#threshold"; target = "#bloom_0"; targetScale = "0.5 0.5"; @@ -180,8 +180,8 @@ function BloomPostFX::SetupBlurFX( %this ) { internalName = %mipName; allowReflectPass = false; - shader = PFX_BloomDownSample_Shader; - stateBlock = BloomPostFX_SampleStateBlock; + shader = Bloom_DownSampleShader; + stateBlock = Bloom_SampleStateBlock; texture[0] = %textureName; target = "#" @ %mipName; targetScale = "0.5 0.5"; @@ -202,8 +202,8 @@ function BloomPostFX::SetupBlurFX( %this ) { internalName = %mipName; allowReflectPass = false; - shader = PFX_BloomUpSample_Shader; - stateBlock = BloomPostFX_SampleStateBlock; + shader = Bloom_UpSampleShader; + stateBlock = Bloom_SampleStateBlock; texture[0] = %nxt; texture[1] = %textureName; target = "#" @ %mipName; @@ -243,7 +243,7 @@ function BloomPostFX::populatePostFXSettings(%this) PostEffectEditorInspector.startGroup("BloomPostFX - General"); PostEffectEditorInspector.addCallbackField("$PostFX::BloomPostFX::Enabled", "Enabled", "bool", "", $PostFX::BloomPostFX::Enabled, "", "toggleBloomPostFX"); PostEffectEditorInspector.addField("$PostFX::BloomPostFX::threshold", "Threshold", "range", "", $PostFX::BloomPostFX::threshold, "0 1 10"); - PostEffectEditorInspector.addField("$PostFX::BloomPostFX::intensity", "Intensity", "range", "", $PostFX::BloomPostFX::intensity, "0 2 10"); + PostEffectEditorInspector.addField("$PostFX::BloomPostFX::intensity", "Intensity", "range", "", $PostFX::BloomPostFX::intensity, "0 10 10"); PostEffectEditorInspector.addField("$PostFX::BloomPostFX::radius", "Radius", "float", "", $PostFX::BloomPostFX::radius, ""); PostEffectEditorInspector.endGroup(); @@ -309,8 +309,8 @@ singleton PostEffect( BloomPostFX ) renderBin = "EditorBin"; renderPriority = 10000; - shader = PFX_BloomThreshold_Shader; - stateBlock = BloomPostFX_SampleStateBlock; + shader = Bloom_ThresholdShader; + stateBlock = Bloom_SampleStateBlock; texture[0] = "$backBuffer"; target = "#threshold"; targetFormat = "GFXFormatR16G16B16A16F"; @@ -319,8 +319,8 @@ singleton PostEffect( BloomPostFX ) { internalName = "bloomFinal"; allowReflectPass = false; - shader = PFX_BloomStrength_Shader; - stateBlock = BloomPostFX_Add_SampleStateBlock; + shader = Bloom_StrengthShader; + stateBlock = Bloom_Add_SampleStateBlock; texture[0] = "#upSample_0"; target = "$backBuffer"; }; diff --git a/Templates/BaseGame/game/core/postFX/scripts/Bloom/bloomStrengthP.hlsl b/Templates/BaseGame/game/core/postFX/scripts/Bloom/bloomStrengthP.hlsl index e0686ad15..f0d9d56c6 100644 --- a/Templates/BaseGame/game/core/postFX/scripts/Bloom/bloomStrengthP.hlsl +++ b/Templates/BaseGame/game/core/postFX/scripts/Bloom/bloomStrengthP.hlsl @@ -21,6 +21,7 @@ //----------------------------------------------------------------------------- #include "core/rendering/shaders/postFX/postFx.hlsl" +#include "core/rendering/shaders/torque.hlsl" TORQUE_UNIFORM_SAMPLER2D(inputTex, 0); TORQUE_UNIFORM_SAMPLER2D(dirtTex, 1); @@ -47,5 +48,5 @@ float4 main(PFXVertToPix IN) : TORQUE_TARGET0 upSample.rgb += upSample.rgb * dirt; #endif - return upSample; + return upSample * M_1OVER_PI_F; } diff --git a/Templates/BaseGame/game/core/postFX/scripts/Bloom/bloomThresholdP.hlsl b/Templates/BaseGame/game/core/postFX/scripts/Bloom/bloomThresholdP.hlsl index 597afc1bd..4c016ea60 100644 --- a/Templates/BaseGame/game/core/postFX/scripts/Bloom/bloomThresholdP.hlsl +++ b/Templates/BaseGame/game/core/postFX/scripts/Bloom/bloomThresholdP.hlsl @@ -21,6 +21,7 @@ //----------------------------------------------------------------------------- #include "core/rendering/shaders/postFX/postFx.hlsl" +#include "core/rendering/shaders/torque.hlsl" TORQUE_UNIFORM_SAMPLER2D(inputTex, 0); uniform float threshold; @@ -28,7 +29,11 @@ uniform float threshold; float4 main(PFXVertToPix IN) : TORQUE_TARGET0 { float4 screenColor = TORQUE_TEX2D(inputTex, IN.uv0); + float lum = hdrLuminance(screenColor.rgb); + float brightness = max(screenColor.r, max(screenColor.g, screenColor.b)); float contribution = saturate(brightness - threshold) / max(brightness, 0.0001f); - return screenColor * contribution; + contribution = sqr(lum * contribution); + + return max(screenColor * sqr(contribution), 0.0001f); } diff --git a/Templates/BaseGame/game/core/postFX/scripts/Bloom/gl/bloomStrengthP.glsl b/Templates/BaseGame/game/core/postFX/scripts/Bloom/gl/bloomStrengthP.glsl index 64763ce27..cf17bfb17 100644 --- a/Templates/BaseGame/game/core/postFX/scripts/Bloom/gl/bloomStrengthP.glsl +++ b/Templates/BaseGame/game/core/postFX/scripts/Bloom/gl/bloomStrengthP.glsl @@ -22,6 +22,7 @@ #include "core/rendering/shaders/gl/hlslCompat.glsl" #include "core/rendering/shaders/postFX/gl/postFx.glsl" +#include "core/rendering/shaders/gl/torque.glsl" #include "shadergen:/autogenConditioners.h" #line 27 @@ -53,5 +54,5 @@ void main() upSample.rgb += upSample.rgb * dirt; #endif - OUT_col = upSample; + OUT_col = upSample * M_1OVER_PI_F; } diff --git a/Templates/BaseGame/game/core/postFX/scripts/Bloom/gl/bloomThresholdP.glsl b/Templates/BaseGame/game/core/postFX/scripts/Bloom/gl/bloomThresholdP.glsl index 7ae3f89f1..2a93f5f25 100644 --- a/Templates/BaseGame/game/core/postFX/scripts/Bloom/gl/bloomThresholdP.glsl +++ b/Templates/BaseGame/game/core/postFX/scripts/Bloom/gl/bloomThresholdP.glsl @@ -22,6 +22,7 @@ #include "core/rendering/shaders/gl/hlslCompat.glsl" #include "core/rendering/shaders/postFX/gl/postFx.glsl" +#include "core/rendering/shaders/gl/torque.glsl" #include "shadergen:/autogenConditioners.h" #line 27 @@ -34,7 +35,11 @@ out vec4 OUT_col; void main() { vec4 screenColor = texture(inputTex, IN_uv0); + float lum = hdrLuminance(screenColor.rgb); + float brightness = max(screenColor.r, max(screenColor.g, screenColor.b)); float contribution = clamp(brightness - threshold, 0.0, 1.0) / max(brightness, 0.0001); - OUT_col = screenColor * contribution; + contribution = sqr(lum * contribution); + + OUT_col = max(screenColor * sqr(contribution), 0.0001); } diff --git a/Templates/BaseGame/game/core/rendering/shaders/gl/torque.glsl b/Templates/BaseGame/game/core/rendering/shaders/gl/torque.glsl index 4ec0303aa..14f5f9f24 100644 --- a/Templates/BaseGame/game/core/rendering/shaders/gl/torque.glsl +++ b/Templates/BaseGame/game/core/rendering/shaders/gl/torque.glsl @@ -27,7 +27,7 @@ float M_HALFPI_F = 1.57079632679489661923; float M_PI_F = 3.14159265358979323846; float M_2PI_F = 6.28318530717958647692; -float M_1OVER_PI_F = 0.31830988618f; +float M_1OVER_PI_F = 0.31830988618; /// Calculate fog based on a start and end positions in worldSpace. float computeSceneFog( vec3 startPos,