FAUX HDR opengl ES 2.0 shader algorithm

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;
}

This topic was automatically closed 183 days after the last reply. New replies are no longer allowed.