Here's my compositor script:
Code: Select all
compositor HDRCompositor
{
technique
{
compositor_logic HDRCompositor // Use our HDR compositor logic
target_output
{
input none // Start with clear output
// Fullscreen quad with our texture
pass render_quad // Pass type
{
material HDRImage // Will map our HDR image
}
}
}
}
Code: Select all
Tone mapping shader:
// HDR_fs.glsl: Fragment shader for HDR
#version 120
#pragma debug(on)
uniform float TimeElapsed;
uniform sampler2D g_samDiffuseMap;
uniform float g_fExposureLevel;
uniform float g_fMaxBrightLevel;
uniform float g_fContrast; //Contrast
uniform float g_fChromaticAdaptation; //Chromatic Adaptation
uniform float g_fLightAdaption; //Light Adaptation
uniform float g_fMean; // Mean
uniform float g_fIntensity; //Intensity
// Luminance (Ref 4)
float luminance(vec3 vecRGB)
{
return 0.299 * vecRGB.r + 0.587 * vecRGB.g + 0.114 * vecRGB.b;
}
// Tone mapping (Ref 4)
void toneMap(inout vec4 vecFragmentColor)
{
float fLuminance = luminance(vecFragmentColor.rgb); // Luminance
vec3 vecLocalAdaptation = g_fContrast * vecFragmentColor.rgb + (1.0 - g_fContrast) * fLuminance; // Local adaption
vec3 vecGlobalAdaption = vec3(g_fContrast * g_fMean + (1.0 - g_fContrast) * g_fMean); // Global adaption
vec3 vecPixelAdaption = g_fLightAdaption * vecLocalAdaptation + (1.0 - g_fLightAdaption) * vecGlobalAdaption; // Pixel adaption
vecFragmentColor.rgb /= (vecFragmentColor.rgb + pow(g_fIntensity * vecPixelAdaption, vec3(g_fContrast)));
}
// Main entry point
void main()
{
float fIntensity = 1.0;
float fExposure = 16.0;
vec4 vecMaterialColor = vec4(0.1, 0.2, 0.3, 1.0); // Material color
vec4 vecFragmentColor = texture2D(g_samDiffuseMap, gl_TexCoord[0].st); // Sample the diffuse map
// Reinhard 5 tone mapping
toneMap(vecFragmentColor);
//vecFragmentColor = vec4(fRed, fGreen, fBlue, 1.0) * fIntensity;
gl_FragColor = vec4(vecFragmentColor.rgb, 1.0);
}