iOS着色器中的人工制品

iOS着色器中的人工制品,ios,opengl-es,glsl,hlsl,fragment-shader,Ios,Opengl Es,Glsl,Hlsl,Fragment Shader,我正在尝试合并2个图像,但边界中有瑕疵,由于混叠,像素的alpha小于1。是否有任何建议表明我做错了什么:/例如,如果我通过UIImageViews OpenGL ES使用后倍增alpha,这意味着通道是独立混合的,但这对于许多混合操作来说是不准确的 想象一下,将源片段[1.0,0.0,0.0,0.5](红色,半透明)混合到目标帧缓冲区[0.0,0.0,1.0,0.0](蓝色,完全透明)。从逻辑上讲,您可能期望“半透明红色”,因为原始目标颜色由于0.0 alpha值而不可见。但是,由于通道是独立

我正在尝试合并2个图像,但边界中有瑕疵,由于混叠,像素的alpha小于1。是否有任何建议表明我做错了什么:/例如,如果我通过
UIImageViews


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存储中的精度损失,您需要不同的混合方程)。

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存储中的精度损失,您需要不同的混合方程)。

另一个选项是使用,以便您可以自己控制整个混合方程。另一个选项是使用,以便您可以自己控制整个混合方程。
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;
}