///-------------------------------------------------------------------------------------------------
///
/// Charles Humphrey, 12/07/2025.
/// Fixes for DX implementation.
///
///-------------------------------------------------------------------------------------------------
#include "PPVertexShader.fxh"
// Pixel shader combines the bloom image with the original
// scene, using tweakable intensity levels and saturation.
// This is the final step in applying a bloom postprocess.
sampler BloomSampler : register(s0);
sampler BaseSampler : register(s1);
float BloomIntensity;
float BaseIntensity;
float BloomSaturation;
float BaseSaturation;
// Helper for modifying the saturation of a color.
float4 AdjustSaturation(float4 color, float saturation)
{
// The constants 0.3, 0.59, and 0.11 are chosen because the
// human eye is more sensitive to green light, and less to blue.
float grey = dot(color, float4(0.3, 0.59, 0.11, 0.0));
return lerp(grey, color, saturation);
}
///-------------------------------------------------------------------------------------------------
/// Function now uses correct vertex input structure for both OGL and DX
///
/// Charles Humphrey, 12/07/2025.
///-------------------------------------------------------------------------------------------------
float4 PixelShaderFunction(VertexShaderOutput input) : COLOR0
{
// Look up the bloom and original base image colors.
float4 bloom = tex2D(BloomSampler, input.TexCoord);
float4 base = tex2D(BaseSampler, input.TexCoord);
// Adjust color saturation and intensity.
bloom = AdjustSaturation(bloom, BloomSaturation) * BloomIntensity;
base = AdjustSaturation(base, BaseSaturation) * BaseIntensity;
// Darken down the base image in areas where there is a lot of bloom,
// to prevent things looking excessively burned-out.
base *= (1 - saturate(bloom));
// Combine the two images.
return base + bloom;
}
technique BloomCombine
{
pass Pass1
{
PixelShader = compile PS_SHADERMODEL PixelShaderFunction();
}
}