【问题标题】:Artefact in shader for iOSiOS 着色器中的人工制品
【发布时间】:2018-04-01 18:03:49
【问题描述】:
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将一个放在另一个上面,则不会出现这种情况@

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多