在OpenGL场景中提取场景“明亮部分”和闪烁

时间:2014-10-13 13:35:16

标签: opengl shader

我已经编写了以下着色器来执行场景的明亮传递,因此我可以提取亮度,以便以后模糊,作为"发光的一部分"效果。

// "Bright" pixel shader.

#version 420

uniform sampler2D Map_Diffuse;
uniform float uniform_Threshold;

in vec2 attrib_Fragment_Texture;
out vec4 Out_Colour;

void main(void) 
{
    vec3 luminances = vec3(0.2126, 0.7152, 0.0722);
    vec4 texel = texture2D(Map_Diffuse, attrib_Fragment_Texture);

    float luminance = dot(luminances, texel.rgb);

    luminance = max(0.0, luminance - uniform_Threshold);

    texel.rgb *= sign(luminance); 
    texel.a = 1.0;

    Out_Colour = texel;
}

明亮区域已成功提取,但场景中有一些不稳定的特征,导致像素闪烁一段时间。当它变得模糊时,效果更加明显,发光点也会闪烁。例如,在我发布的屏幕截图中的第三图像中出现伪像,其中对象处于阴影中,因此场景中的亮度低得多。它们主要存在于从光线到光线的过渡期间(在物体旋转期间),其中边缘刚刚击中光线。

enter image description here

我的问题是询问是否有一种方法可以在着色器中检测并缓解这种情况。请注意,明亮通道是一般下采样的一部分,从屏幕分辨率到512x512。

1 个答案:

答案 0 :(得分:0)

你也可以阅读周围的像素并根据它进行数学运算。

有点像here