Bloom Tweaks

This commit is contained in:
Samuel Skiff 2022-08-23 03:44:48 -05:00
parent 99d8f28957
commit 633053a307
3 changed files with 157 additions and 159 deletions

View file

@ -28,55 +28,53 @@ $PostFX::BloomPostFX::dirtEnabled = true;
$PostFX::BloomPostFX::dirtScale = 2048.0; $PostFX::BloomPostFX::dirtScale = 2048.0;
$PostFX::BloomPostFX::dirtIntensity = 7.0; $PostFX::BloomPostFX::dirtIntensity = 7.0;
$mipsCount = 4;
singleton ShaderData( PFX_BloomThreshold_Shader ) singleton ShaderData( PFX_BloomThreshold_Shader )
{ {
DXVertexShaderFile = $Core::CommonShaderPath @ "/postFX/postFxV.hlsl"; DXVertexShaderFile = $Core::CommonShaderPath @ "/postFX/postFxV.hlsl";
DXPixelShaderFile = "./bloomThresholdP.hlsl"; DXPixelShaderFile = "./bloomThresholdP.hlsl";
samplerNames[0] = "$inputTex"; samplerNames[0] = "$inputTex";
pixVersion = 3.0; pixVersion = 3.0;
}; };
singleton ShaderData( PFX_BloomDownSample_Shader ) singleton ShaderData( PFX_BloomDownSample_Shader )
{ {
DXVertexShaderFile = $Core::CommonShaderPath @ "/postFX/postFxV.hlsl"; DXVertexShaderFile = $Core::CommonShaderPath @ "/postFX/postFxV.hlsl";
DXPixelShaderFile = "./downSampleP.hlsl"; DXPixelShaderFile = "./downSampleP.hlsl";
samplerNames[0] = "$inputTex"; samplerNames[0] = "$inputTex";
pixVersion = 3.0; pixVersion = 3.0;
}; };
singleton ShaderData( PFX_BloomUpSample_Shader ) singleton ShaderData( PFX_BloomUpSample_Shader )
{ {
DXVertexShaderFile = $Core::CommonShaderPath @ "/postFX/postFxV.hlsl"; DXVertexShaderFile = $Core::CommonShaderPath @ "/postFX/postFxV.hlsl";
DXPixelShaderFile = "./upSampleP.hlsl"; DXPixelShaderFile = "./upSampleP.hlsl";
samplerNames[0] = "$nxtTex"; samplerNames[0] = "$nxtTex";
samplerNames[1] = "$mipTex"; samplerNames[1] = "$mipTex";
pixVersion = 3.0; pixVersion = 3.0;
}; };
singleton ShaderData( PFX_BloomStrength_Shader ) singleton ShaderData( PFX_BloomStrength_Shader )
{ {
DXVertexShaderFile = $Core::CommonShaderPath @ "/postFX/postFxV.hlsl"; DXVertexShaderFile = $Core::CommonShaderPath @ "/postFX/postFxV.hlsl";
DXPixelShaderFile = "./bloomStrengthP.hlsl"; DXPixelShaderFile = "./bloomStrengthP.hlsl";
samplerNames[0] = "$inputTex"; samplerNames[0] = "$inputTex";
samplerNames[1] = "$dirtTex"; samplerNames[1] = "$dirtTex";
pixVersion = 3.0; pixVersion = 3.0;
}; };
singleton GFXStateBlockData( BloomPostFX_SampleStateBlock : PFX_DefaultStateBlock ) singleton GFXStateBlockData( BloomPostFX_SampleStateBlock : PFX_DefaultStateBlock )
{ {
samplersDefined = true; samplersDefined = true;
samplerStates[0] = SamplerClampLinear; samplerStates[0] = SamplerClampLinear;
samplerStates[1] = SamplerClampLinear; samplerStates[1] = SamplerClampLinear;
}; };
singleton GFXStateBlockData( BloomPostFX_Add_SampleStateBlock : PFX_DefaultStateBlock ) singleton GFXStateBlockData( BloomPostFX_Add_SampleStateBlock : PFX_DefaultStateBlock )
@ -92,120 +90,119 @@ singleton GFXStateBlockData( BloomPostFX_Add_SampleStateBlock : PFX_DefaultState
blendSrc = GFXBlendOne; blendSrc = GFXBlendOne;
blendDest = GFXBlendOne; blendDest = GFXBlendOne;
samplersDefined = true; samplersDefined = true;
samplerStates[0] = SamplerClampLinear; samplerStates[0] = SamplerClampLinear;
samplerStates[1] = SamplerWrapLinear; samplerStates[1] = SamplerWrapLinear;
}; };
function BloomPostFX::setShaderConsts( %this ) function BloomPostFX::setShaderConsts( %this )
{ {
%this.setShaderConst("$threshold", $PostFX::BloomPostFX::threshold); %this.setShaderConst("$threshold", $PostFX::BloomPostFX::threshold);
%blur = %this->bloomBlur; %blur = %this->bloomBlur;
for (%idx = 0; %idx < $mipsCount; %idx++) for (%idx = 0; %idx < %this.mipsCount; %idx++)
{ {
%mip = %blur.getObject($mipsCount + %idx); %mip = %blur.getObject(%this.mipsCount + %idx);
%mip.setShaderConst("$filterRadius", $PostFX::BloomPostFX::radius); %mip.setShaderConst("$filterRadius", $PostFX::BloomPostFX::radius);
} }
%final = %this->bloomFinal; %final = %this->bloomFinal;
%final.setShaderConst("$strength", $PostFX::BloomPostFX::intensity); %final.setShaderConst("$strength", $PostFX::BloomPostFX::intensity);
%dirtScale = $PostFX::BloomPostFX::dirtScale; %dirtScale = $PostFX::BloomPostFX::dirtScale;
%dirtIntensity = $PostFX::BloomPostFX::dirtIntensity; %dirtIntensity = $PostFX::BloomPostFX::dirtIntensity;
%final.setShaderConst("$dirtParams", %dirtScale SPC %dirtScale SPC %dirtIntensity); %final.setShaderConst("$dirtParams", %dirtScale SPC %dirtScale SPC %dirtIntensity);
} }
function BloomPostFX::preProcess( %this ) function BloomPostFX::preProcess( %this )
{ {
if (%this.dirtEnabled != $PostFX::BloomPostFX::dirtEnabled) if (%this.dirtEnabled != $PostFX::BloomPostFX::dirtEnabled)
{ {
%this.dirtEnabled = $PostFX::BloomPostFX::dirtEnabled; %this.dirtEnabled = $PostFX::BloomPostFX::dirtEnabled;
%final = %this->bloomFinal; %final = %this->bloomFinal;
if (%this.dirtEnabled) if (%this.dirtEnabled)
{ {
%final.setShaderMacro("USE_DIRT"); %final.setShaderMacro("USE_DIRT");
} else { } else {
%final.removeShaderMacro("USE_DIRT"); %final.removeShaderMacro("USE_DIRT");
} }
} }
if($PostFX::BloomPostFX::dirtImage $= "") if($PostFX::BloomPostFX::dirtImage $= "")
{ {
$PostFX::BloomPostFX::dirtImage = "core/postFX/images/lensDirt.png"; $PostFX::BloomPostFX::dirtImage = "core/postFX/images/lensDirt.png";
} }
if($PostFX::BloomPostFX::dirtImage !$= "") if($PostFX::BloomPostFX::dirtImage !$= "")
{ {
%final = %this->bloomFinal; %final = %this->bloomFinal;
%final.setTexture(1, $PostFX::BloomPostFX::dirtImage); %final.setTexture(1, $PostFX::BloomPostFX::dirtImage);
} }
} }
// This function sets up s sort of "mip-chain" for the bloom effect // This function sets up s sort of "mip-chain" for the bloom effect
// Not really "optimal" but it works well enough // Not really "optimal" but it works well enough
function SetupBlurFX() function BloomPostFX::SetupBlurFX( %this )
{ {
%blurFX = new PostEffect() %blurFX = new PostEffect()
{ {
internalName = "bloomBlur"; internalName = "bloomBlur";
allowReflectPass = false; allowReflectPass = false;
shader = PFX_BloomDownSample_Shader; shader = PFX_BloomDownSample_Shader;
stateBlock = BloomPostFX_SampleStateBlock; stateBlock = BloomPostFX_SampleStateBlock;
texture[0] = "#threshold"; texture[0] = "#threshold";
target = "#bloom_0"; target = "#bloom_0";
targetFormat = "GFXFormatR16G16B16A16F"; targetFormat = "GFXFormatR16G16B16A16F";
}; };
%textureName = "#bloom_0"; %textureName = "#bloom_0";
for (%idx = 0; %idx < $mipsCount; %idx++) for (%idx = 0; %idx < %this.mipsCount; %idx++)
{ {
%mipName = "bloom_" @ (%idx + 1); %mipName = "bloom_" @ (%idx + 1);
%mipFX = new PostEffect() %mipFX = new PostEffect()
{ {
internalName = %mipName; internalName = %mipName;
allowReflectPass = false; allowReflectPass = false;
shader = PFX_BloomDownSample_Shader; shader = PFX_BloomDownSample_Shader;
stateBlock = BloomPostFX_SampleStateBlock; stateBlock = BloomPostFX_SampleStateBlock;
texture[0] = %textureName; texture[0] = %textureName;
target = "#" @ %mipName; target = "#" @ %mipName;
targetScale = "0.5 0.5"; targetScale = "0.5 0.5";
targetFormat = "GFXFormatR16G16B16A16F"; targetFormat = "GFXFormatR16G16B16A16F";
}; };
%blurFX.add(%mipFX); %blurFX.add(%mipFX);
%textureName = "#" @ %mipName; %textureName = "#" @ %mipName;
} }
for (%idx = $mipsCount; %idx > 0; %idx--) for (%idx = %this.mipsCount; %idx > 0; %idx--)
{ {
%nxt = "#bloom_" @ (%idx - 1); %nxt = "#bloom_" @ (%idx - 1);
%mipName = "upsample_" @ (%idx - 1); %mipName = "upsample_" @ (%idx - 1);
echo(%mipName SPC %textureName SPC %nxt); echo(%mipName SPC %textureName SPC %nxt);
%mipFX = new PostEffect() %mipFX = new PostEffect()
{ {
internalName = %mipName; internalName = %mipName;
allowReflectPass = false; allowReflectPass = false;
shader = PFX_BloomUpSample_Shader; shader = PFX_BloomUpSample_Shader;
stateBlock = BloomPostFX_SampleStateBlock; stateBlock = BloomPostFX_SampleStateBlock;
texture[0] = %nxt; texture[0] = %nxt;
texture[1] = %textureName; texture[1] = %textureName;
target = "#" @ %mipName; target = "#" @ %mipName;
}; };
%blurFX.add(%mipFX); %blurFX.add(%mipFX);
%textureName = "#" @ %mipName; %textureName = "#" @ %mipName;
} }
return %blurFX; %this.add(%blurFX);
} }
function BloomPostFX::onAdd(%this) function BloomPostFX::onAdd(%this)
{ {
%this.add(SetupBlurFX()); %this.SetupBlurFX();
//Register the postFX with the manager //Register the postFX with the manager
PostFXManager.registerPostEffect(%this); PostFXManager.registerPostEffect(%this);
} }
@ -227,17 +224,17 @@ function BloomPostFX::populatePostFXSettings(%this)
{ {
PostEffectEditorInspector.startGroup("BloomPostFX - General"); PostEffectEditorInspector.startGroup("BloomPostFX - General");
PostEffectEditorInspector.addCallbackField("$PostFX::BloomPostFX::Enabled", "Enabled", "bool", "", $PostFX::BloomPostFX::Enabled, "", "toggleBloomPostFX"); 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::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 2 10");
PostEffectEditorInspector.addField("$PostFX::BloomPostFX::radius", "Radius", "float", "", $PostFX::BloomPostFX::radius, ""); PostEffectEditorInspector.addField("$PostFX::BloomPostFX::radius", "Radius", "float", "", $PostFX::BloomPostFX::radius, "");
PostEffectEditorInspector.endGroup();
PostEffectEditorInspector.startGroup("BloomPostFX - Lens Dirt");
PostEffectEditorInspector.addField("$PostFX::BloomPostFX::dirtEnabled", "Enable Dirt", "bool", "", $PostFX::BloomPostFX::dirtEnabled, "");
PostEffectEditorInspector.addField("$PostFX::BloomPostFX::dirtScale", "Scale", "float", "", $PostFX::BloomPostFX::dirtScale, "");
PostEffectEditorInspector.addField("$PostFX::BloomPostFX::dirtIntensity", "Intensity", "float", "", $PostFX::BloomPostFX::dirtIntensity, "");
PostEffectEditorInspector.addField("$PostFX::BloomPostFX::dirtImage", "Dirt Image", "image", "", $PostFX::BloomPostFX::dirtImage, "");
PostEffectEditorInspector.endGroup(); PostEffectEditorInspector.endGroup();
PostEffectEditorInspector.startGroup("BloomPostFX - Dirt");
PostEffectEditorInspector.addField("$PostFX::BloomPostFX::dirtEnabled", "Enable Dirt", "bool", "", $PostFX::BloomPostFX::dirtEnabled, "");
PostEffectEditorInspector.addField("$PostFX::BloomPostFX::dirtScale", "Scale", "float", "", $PostFX::BloomPostFX::dirtScale, "");
PostEffectEditorInspector.addField("$PostFX::BloomPostFX::dirtIntensity", "Intensity", "float", "", $PostFX::BloomPostFX::dirtIntensity, "");
PostEffectEditorInspector.addField("$PostFX::BloomPostFX::dirtImage", "Dirt Image", "image", "", $PostFX::BloomPostFX::dirtImage, "");
PostEffectEditorInspector.endGroup();
} }
//This is called back from our callbackField defined in populatePostFXSettings to //This is called back from our callbackField defined in populatePostFXSettings to
@ -264,41 +261,42 @@ function BloomPostFX::applyFromPreset(%this)
function BloomPostFX::savePresetSettings(%this) function BloomPostFX::savePresetSettings(%this)
{ {
PostFXManager::savePresetSetting("$PostFX::BloomPostFX::Enabled"); PostFXManager::savePresetSetting("$PostFX::BloomPostFX::Enabled");
PostFXManager::savePresetSetting("$PostFX::BloomPostFX::threshold"); PostFXManager::savePresetSetting("$PostFX::BloomPostFX::threshold");
PostFXManager::savePresetSetting("$PostFX::BloomPostFX::intensity"); PostFXManager::savePresetSetting("$PostFX::BloomPostFX::intensity");
PostFXManager::savePresetSetting("$PostFX::BloomPostFX::radius"); PostFXManager::savePresetSetting("$PostFX::BloomPostFX::radius");
PostFXManager::savePresetSetting("$PostFX::BloomPostFX::dirtEnabled"); PostFXManager::savePresetSetting("$PostFX::BloomPostFX::dirtEnabled");
PostFXManager::savePresetSetting("$PostFX::BloomPostFX::dirtScale"); PostFXManager::savePresetSetting("$PostFX::BloomPostFX::dirtScale");
PostFXManager::savePresetSetting("$PostFX::BloomPostFX::dirtIntensity"); PostFXManager::savePresetSetting("$PostFX::BloomPostFX::dirtIntensity");
PostFXManager::savePresetSetting("$PostFX::BloomPostFX::dirtImage"); PostFXManager::savePresetSetting("$PostFX::BloomPostFX::dirtImage");
} }
//Our actual postFX //Our actual postFX
singleton PostEffect( BloomPostFX ) singleton PostEffect( BloomPostFX )
{ {
mipsCount = 4;
enabled = false; enabled = false;
allowReflectPass = false; allowReflectPass = false;
renderTime = "PFXBeforeBin"; renderTime = "PFXBeforeBin";
renderBin = "EditorBin"; renderBin = "EditorBin";
renderPriority = 9999; renderPriority = 9998;
shader = PFX_BloomThreshold_Shader; shader = PFX_BloomThreshold_Shader;
stateBlock = BloomPostFX_SampleStateBlock; stateBlock = BloomPostFX_SampleStateBlock;
texture[0] = "$backBuffer"; texture[0] = "$backBuffer";
target = "#threshold"; target = "#threshold";
targetFormat = "GFXFormatR16G16B16A16F"; targetFormat = "GFXFormatR16G16B16A16F";
targetClear = PFXTargetClear_OnDraw; targetClear = PFXTargetClear_OnDraw;
targetClearColor = "0 0 0 0"; targetClearColor = "0 0 0 0";
new PostEffect() new PostEffect()
{ {
internalName = "bloomFinal"; internalName = "bloomFinal";
allowReflectPass = false; allowReflectPass = false;
shader = PFX_BloomStrength_Shader; shader = PFX_BloomStrength_Shader;
stateBlock = BloomPostFX_Add_SampleStateBlock; stateBlock = BloomPostFX_Add_SampleStateBlock;
texture[0] = "#upsample_0"; texture[0] = "#upsample_0";
target = "$backBuffer"; target = "$backBuffer";
}; };
}; };

View file

@ -31,6 +31,6 @@ float4 main(PFXVertToPix IN) : TORQUE_TARGET0
float brightness = max(screenColor.r, max(screenColor.g, screenColor.b)); float brightness = max(screenColor.r, max(screenColor.g, screenColor.b));
float contribution = max(brightness - threshold, 0); float contribution = max(brightness - threshold, 0);
contribution /= max(brightness, 0.0001f); contribution /= max(brightness, 0.0001f);
clip(contribution > 0.00001f ? 1 : -1); clip(contribution > 0.0001f ? 1 : -1);
return screenColor * contribution; return screenColor * contribution;
} }

View file

@ -1,6 +1,6 @@
$PostFX::BloomPostFX::Enabled = "1"; $PostFX::BloomPostFX::Enabled = "1";
$PostFX::BloomPostFX::threshold = "0.5"; $PostFX::BloomPostFX::threshold = "0.394230783";
$PostFX::BloomPostFX::intensity = "0.5"; $PostFX::BloomPostFX::intensity = "0.192307696";
$PostFX::BloomPostFX::radius = "8"; $PostFX::BloomPostFX::radius = "8";
$PostFX::BloomPostFX::dirtEnabled = "1"; $PostFX::BloomPostFX::dirtEnabled = "1";
$PostFX::BloomPostFX::dirtScale = "2048"; $PostFX::BloomPostFX::dirtScale = "2048";
@ -11,7 +11,7 @@ $PostFX::HDRPostFX::exposureValue = 1;
$PostFX::HDRPostFX::minLuminace = 0.001; $PostFX::HDRPostFX::minLuminace = 0.001;
$PostFX::HDRPostFX::whiteCutoff = 1; $PostFX::HDRPostFX::whiteCutoff = 1;
$PostFX::HDRPostFX::adaptRate = "1"; $PostFX::HDRPostFX::adaptRate = "1";
$PostFX::HDRPostFX::tonemapMode = "ACES"; $PostFX::HDRPostFX::tonemapMode = "Filmic";
$PostFX::HDRPostFX::enableBloom = "0"; $PostFX::HDRPostFX::enableBloom = "0";
$PostFX::HDRPostFX::brightPassThreshold = 1; $PostFX::HDRPostFX::brightPassThreshold = 1;
$PostFX::HDRPostFX::gaussMultiplier = 0.3; $PostFX::HDRPostFX::gaussMultiplier = 0.3;