2014-04-19 159 views
0

我想创建一个GLSL着色器来产生FAUX HDR效果,也称为FAKE HDR,(不要与普通HDR混淆,其中3幅图像具有不同的曝光度)。 我需要在单个着色器算法中创建它,而不是使用不同通过的多个着色器。FAUX HDR opengl ES 2.0着色器算法

这个想法是实现图像,如在下一个链接,其中图像具有较高的局部微对比度和强烈的色彩,与一些边缘周围最重要的全息白色光环。

Image Sample 1 - Image Sample 2 - Image Sample 3

从上中下一个文档中的步骤我开始建立着色器:

HDR steps documentation

到目前为止,下面的代码是我的结果,问题是真的没有显示任何所需的FAUX HDR结果。

顶点着色器:

varying vec2 v_texcoord; 

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

片段着色器:

着色器的
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; 
} 

回答

0

代码计算像素的亮度,然后通过非常简单的数学修改它。

但是,链接中的文档描述了更复杂的过程,包括计算直方图和累积密度函数,然后根据该数据修改图片中的像素。

该过程考虑了所有图片亮度的变化,而不仅仅是独立像素的亮度。

由于过于简单,您没有在边缘达到全息光环。

也就是说,GLSL片段着色器不适合执行描述algorythm的FAUX HDR任务,因为它们是按像素执行的。并且重新计算每个像素的直方图和累积密度函数是无效的。

相关问题