Opengles片段着色器实现了效果

时间:2012-03-14 14:32:09

标签: ios xcode opengl-es

我想在中心切割上实现图像的平滑合并效果。我从下面的代码中获得了中心切割。

varying highp vec2 textureCoordinate;
uniform sampler2D videoFrame;

void main(){
    vec4 CurrentColor = vec4(0.0);

    if(textureCoordinate.y < 0.5){
         CurrentColor = texture2D(videoFrame,vec2(textureCoordinate.x,(textureCoordinate.y-0.125)));     
    } else{
         CurrentColor = texture2D(videoFrame,vec2(textureCoordinate.x,(textureCoordinate.y+0.125))); 
    }

    gl_fragColor = CurrentColor;    
}

上面的代码给下面的图像效果。

实际值:

Actual

中心切割:

Centre cut

期望的输出:

Desired output

我想要的是锋利的切割不应该存在,两半应该有平滑的渐变合并。

1 个答案:

答案 0 :(得分:2)

你想要一个真正的模糊,还是只是线性混合?因为模糊涉及模糊内核,而混合将是这两者之间的简单插值,具体取决于y坐标。

这是线性混合的代码。

varying highp vec2 textureCoordinate;
uniform sampler2D videoFrame;

void main(){
    float steepness = 20; /* controls the width of the blending zone, larger values => shaper gradient */
    vec4 a = texture2D(videoFrame,vec2(textureCoordinate.x,(textureCoordinate.y-0.125)));     
    vec4 b = texture2D(videoFrame,vec2(textureCoordinate.x,(textureCoordinate.y+0.125)));

    /* EDIT: Added a clamp to the smoothstep parameter -- should not be neccessary  though */
    vec4 final = smoothstep(a, b, clamp((y-0.5)*steepness, 0., 1.)); /* there's also mix instead of smoothstep, try both */

    gl_FragColor = final;    
}

执行实际模糊有点复杂,因为您要应用该模糊内核。基本上它涉及两个嵌套循环,迭代相邻的纹素并根据一些分布将它们相加(最灵活的是通过附加纹理提供该分布,这也允许添加一些散景)。