iOS 着色器中的人工制品
Artefact in shader for iOS
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
将一个放在另一个上面就不会出现
OpenGL ES 使用 post-multiplied alpha,这意味着通道是独立混合的,但这对于很多混合操作来说是不准确的。
想象一下将源片段 [1.0, 0.0, 0.0, 0.5]
(红色,半透明)混合到目标帧缓冲区 [0.0, 0.0, 1.0, 0.0]
(蓝色,完全透明)。你会合乎逻辑地期望 "half transparent red" 因为原始目标颜色由于 0.0 alpha 值而不可见。但是,因为通道是独立混合的,所以最终的 RGB 颜色会是紫色 [0.5, 0.0, 0.5]
.
解决此问题的快速方法是将颜色值传播到透明区域,以便不透明的粉红色延伸到开始淡出的羽化区域。
解决此问题的更好方法是使用预乘 alpha,但这开始产生副作用(纹素存储精度损失,您需要不同的混合方程)。
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
OpenGL ES 使用 post-multiplied alpha,这意味着通道是独立混合的,但这对于很多混合操作来说是不准确的。
想象一下将源片段 [1.0, 0.0, 0.0, 0.5]
(红色,半透明)混合到目标帧缓冲区 [0.0, 0.0, 1.0, 0.0]
(蓝色,完全透明)。你会合乎逻辑地期望 "half transparent red" 因为原始目标颜色由于 0.0 alpha 值而不可见。但是,因为通道是独立混合的,所以最终的 RGB 颜色会是紫色 [0.5, 0.0, 0.5]
.
解决此问题的快速方法是将颜色值传播到透明区域,以便不透明的粉红色延伸到开始淡出的羽化区域。
解决此问题的更好方法是使用预乘 alpha,但这开始产生副作用(纹素存储精度损失,您需要不同的混合方程)。