代码之家  ›  专栏  ›  技术社区  ›  Vahe Karamyan

iOS着色器中的人工制品

  •  0
  • Vahe Karamyan  · 技术社区  · 8 年前
    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个图像,但边界中有瑕疵,由于混叠,像素的alpha小于1。有什么建议我做错了什么吗:/例如,脸颊有某种束缚,如果我把一个放在另一个上面,就不会出现这种束缚 UIImageViews

    cheek

    1 回复  |  直到 8 年前
        1
  •  2
  •   solidpixel    8 年前

    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,但这开始产生副作用(texel存储中的精度损失,需要不同的混合方程)。