0

I'm trying to create a GLSL shader to produce the FAUX HDR effect, also known as FAKE HDR, (not to confuse with normal HDR where 3 images with different exposures are combined). I need to create it in a single shader algorithm and not multiple shaders with different passes.

The idea is to achieve images such as in the next links, where the image has high local micro-contrast and intense colors, with mostly important a holo white aura around some edges.

Image Sample 1 - Image Sample 2 - Image Sample 3

From the steps on the next document I started to build the shader:

HDR steps documentation

So far the next code is my result, the problem is that is really not showing anything near at all of the desired FAUX HDR result.

VERTEX SHADER:

varying vec2 v_texcoord;

void main()
{
    gl_Position  = gl_ModelViewProjectionMatrix * gl_Vertex;
    v_texcoord   = gl_MultiTexCoord0.xy;    
}

FRAGMENT SHADER:

varying vec2 v_texcoord;
uniform sampler2D texture;

vec3 rgb2hsv(vec3 c)
{
    vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);
    vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));
    vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));

    float d = q.x - min(q.w, q.y);
    float e = 1.0e-10;
    return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);
}

vec3 hsv2rgb(vec3 c)
{
    vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);
    vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);
    return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);
}

void main()
{
    vec4 color = texture2D(texture, v_texcoord);

    vec3 hsv = rgb2hsv(color.rgb);

    float intensity = hsv.z; // the third component holds the brightness

    float log_factor = log(intensity + 1.0);

    log_factor = exp(log_factor) - 1.0;

    hsv.z = log_factor;

    color.rgb = hsv2rgb(hsv);

    gl_FragColor = color;
}
PerracoLabs
  • 16,449
  • 15
  • 74
  • 127

1 Answers1

0

Code of your shader calculates luminosity of pixel and then modifies it by very simple math.

But document in your link describes much more complicated process that involves calculation of histogram and cumulative density function and then modifying pixels in the picture according to that data.

This process takes into consideration changes in brightness in all picture, not just luminosity of indipendent pixels.

You didn't achieved holo aura around edges because of oversimplication.

That said, GLSL fragment shaders does not fit very well for the task of calculating FAUX HDR with described algorythm, since they get executed per-pixel. And it is not efficient to calculate histogram and cumulative density functions for each pixel all over again.

crimson
  • 56
  • 1
  • 5