So, i'm still on my quest to unterstanding the intricacies of HDR and implementing this into my engine. Currently i'm at the step to implementing tonemapping. I stumbled upon this blogposts:
http://filmicworlds.com/blog/filmic-tonemapping-operators/
http://frictionalgames.blogspot.com/2012/09/tech-feature-hdr-lightning.html
and tried to implement some of those mentioned tonemapping methods into my postprocessing shader.
The issue is that none of them creates the same results as shown in the blogpost which definitely has to do with the initial range in which the values are stored in the HDR buffer. For simplicity sake i store the values between 0 and 1 in the HDR buffer (ambient light is 0.3, directional light is 0.7)
This is the tonemapping code:
vec3 Uncharted2Tonemap(vec3 x)
{
float A = 0.15;
float B = 0.50;
float C = 0.10;
float D = 0.20;
float E = 0.02;
float F = 0.30;
return ((x*(A*x+C*B)+D*E)/(x*(A*x+B)+D*F))-E/F;
}
This is without the uncharted tonemapping:
This is with the uncharted tonemapping:
Which makes the image a lot darker.
The shader code looks like this:
void main()
{
vec3 color = texture2D(texture_diffuse, vTexcoord).rgb;
color = Uncharted2Tonemap(color);
//gamma correction (use only if not done in tonemapping code)
color = gammaCorrection(color);
outputF = vec4(color,1.0f);
}
Now, from my understanding is that tonemapping should bring the range down from HDR to 0-1.
But the output of the tonemapping function heavily depends on the initial range of the values in the HDR buffer. (You can't expect to set the sun intensity the first time to 10 and the second time to 1000 and excpect the same result if you feed that into the tonemapper.) So i suppose that this also depends on the exposure which i have to implement?
To check this i plotted the tonemapping curve:
You can see that the curve goes only up to around to a value of 0.21 (while being fed a value of 1) and then basically flattens out. (which would explain why the image got darker.)
My guestion is: In what range should the values in the HDR buffer be which then get tonemapped? Do i have to bring them down to a range of 0-1 by multiplying with the exposure?
For example, if i increase the values of the light by 10 (directional light would be 7 and ambient light 3) then i would need to divide HDR values by 10 in order to get a value range of 0-1 which then could be fed into the tonemapping curve. Is that correct?