适用于iOS的着色器中的人工制品

时间:2017-10-20 14:26:30

标签: ios opengl-es glsl hlsl fragment-shader

kernel vec4 custom(__sample s1, __sample s2) {
            if(s1.a == 0.0)
                return s2;
            if(s2.a == 0.0)
                return s1;
            vec4 res;
            float temp = 1.0 - s2.a;
            res.rgb = s2.rgb * s2.aaa + s1.rgb  * (temp, temp, temp);
            res.a = 1.0;
            return res;
}

我正在尝试合并2个图像,但是在边界中有伪影,由于别名,像素的小于1。有什么建议我做错了吗:/例如,脸颊有某种约束,如果我通过UIImageViews

将一个放在另一个上面,它就不会出现

cheek

1 个答案:

答案 0 :(得分:2)

OpenGL ES使用后乘的alpha,这意味着通道是独立混合的,但对于大量的混合操作来说这是不准确的。

想象一下,将源片段[1.0, 0.0, 0.0, 0.5](红色,半透明)混合到目标帧缓冲区[0.0, 0.0, 1.0, 0.0](蓝色,完全透明)。您会逻辑地期望“半透明红色”,因为原始目标颜色由于0.0 alpha值而不可见。但是,由于通道是独立混合的,因此最终RGB颜色为紫色[0.5, 0.0, 0.5]

解决这个问题的快速方法是将颜色值传播到透明区域,这样不透明的粉红色就会延伸到羽毛区域,在那里您开始淡化它。

解决此问题的更好方法是使用预先倍增的alpha,但这会产生副作用(纹素存储中的精度损失,并且需要不同的混合方程式)。