Part of the Khronos Group
OpenGL.org

The Industry's Foundation for High Performance Graphics

from games to virtual reality, mobile phones to supercomputers

Results 1 to 1 of 1

Thread: FAUX HDR opengl ES 2.0 shader algorithm

  1. #1
    Junior Member Newbie
    Join Date
    Jun 2012
    Posts
    12

    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:

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

    FRAGMENT SHADER:

    Code :
    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;
    }
    Last edited by sanchiski; 04-20-2014 at 07:06 AM.

Tags for this Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •