【问题标题】:GPUImageSoftLightBlendFilter - show black area at transparent area in an image iOSGPUImageSoftLightBlendFilter - 在图像的透明区域显示黑色区域 iOS
【发布时间】:2013-11-06 10:15:49
【问题描述】:

我使用 GPUImage 框架开发了一个 iPhone 应用程序,其中包括广泛使用过滤器、混合图像等。

除了GPUImageSoftLightBlendFilter 之外,一切正常,因为它在图像的透明区域显示黑色区域。如果有人在实施相同的问题时遇到类似类型的问题,请回复。

请查看随附的屏幕截图以获取更多信息。

【问题讨论】:

    标签: ios image filter gpuimage


    【解决方案1】:

    我认为这是由于片段着色器中的除零错误造成的。此混合操作的当前片段着色器代码如下所示:

    mediump vec4 base = texture2D(inputImageTexture, textureCoordinate);
    mediump vec4 overlay = texture2D(inputImageTexture2, textureCoordinate2);
    
    gl_FragColor = base * (overlay.a * (base / base.a) + (2.0 * overlay * (1.0 - (base / base.a)))) + overlay * (1.0 - base.a) + base * (1.0 - overlay.a);
    

    如您所见,如果基础图像(输入 0)的 alpha 通道为零,您将在上面得到一个错误。这会导致这些像素输出黑色。

    一个可能的解决方案是用以下代码替换上面的着色器代码:

     mediump vec4 base = texture2D(inputImageTexture, textureCoordinate);
     mediump vec4 overlay = texture2D(inputImageTexture2, textureCoordinate2);
    
     lowp float alphaDivisor = base.a + step(base.a, 0.0); // Protect against a divide-by-zero blacking out things in the output
     gl_FragColor = base * (overlay.a * (base / alphaDivisor) + (2.0 * overlay * (1.0 - (base / alphaDivisor)))) + overlay * (1.0 - base.a) + base * (1.0 - overlay.a);
    

    尝试将第一部分中的 GPUImageSoftLightBlendFilter 着色器代码替换为第二部分,看看是否会删除黑色区域。如果解决了这个问题,我会把它放到主框架中。

    我相信这源于上述过滤器试图纠正输入图像中的预乘 alpha,我打算将其移除。

    【讨论】:

    • 谢谢你,它工作正常。另外,我已替换为最新的框架,并将第一个代码更改为第二个。
    猜你喜欢
    • 1970-01-01
    • 2012-11-29
    • 1970-01-01
    • 2011-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-29
    • 1970-01-01
    相关资源
    最近更新 更多