Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/96.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 具有不透明度的GPUImageLightedBlendFilter_Ios_Image Processing_Opengl Es_Gpuimage_Core Image - Fatal编程技术网

Ios 具有不透明度的GPUImageLightedBlendFilter

Ios 具有不透明度的GPUImageLightedBlendFilter,ios,image-processing,opengl-es,gpuimage,core-image,Ios,Image Processing,Opengl Es,Gpuimage,Core Image,使用GPUImage我试图用不透明度复制Photoshop Lightning混合模式。不幸的是,使用gpuimageBlendedFilter时,alpha通道没有任何效果 Brad确认alpha可能存在以下问题: 我已经成功地使用符合alpha值的CoreImage复制了PS混合 CIImage *ciImage1 = [[CIImage alloc] initWithImage:input1]; CIImage *ciImage2 = [[CIImage alloc] initWith

使用
GPUImage
我试图用不透明度复制Photoshop Lightning混合模式。不幸的是,使用
gpuimageBlendedFilter
时,alpha通道没有任何效果

Brad确认alpha可能存在以下问题:

我已经成功地使用符合alpha值的
CoreImage
复制了PS混合

CIImage *ciImage1 = [[CIImage alloc] initWithImage:input1];
CIImage *ciImage2 = [[CIImage alloc] initWithImage:input2];

// Alpha adjustment for input1
CIFilter *alphaFilter = [CIFilter filterWithName:@"CIColorMatrix"];
CGFloat rgba[4] = { 0.0, 0.0, 0.0, 0.5 };
CIVector *alphaVector = [CIVector vectorWithValues:rgba count:4];
[alphaFilter setValue:alphaVector forKey:@"inputAVector"];
[alphaFilter setValue:ciImage1 forKey:kCIInputImageKey];

// Lighten blend
CIFilter *blendFilter = [CIFilter filterWithName:@"CILightenBlendMode"];
[blendFilter setValue:alphaFilter.outputImage forKey:kCIInputImageKey];
[blendFilter setValue:ciImage2 forKey:kCIInputBackgroundImageKey];
我尝试过两个版本的
GPUImage
(它们使用不同的方法调整
input1
的alpha)

或:

两个
GPUImage
实现都返回输出,就好像
input1
的alpha是
1.0

我看过互联网上不同来源的混合模式文档,它们都使用以下公式:

max(blend, base)
查看
gpuimageLightedBlendFilter
实现中的着色器,它也使用相同的公式:

lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate);
lowp vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate2);
gl_FragColor = max(textureColor, textureColor2);
然而,Photoshop和CoreImage似乎对alpha有一些额外的操作(可能类似于Gimp:)


任何人都知道如何将alpha通道包括在
gpuimageLightedBlendFilter
公式中?

下面是
gpuimageLightedBlendFilter
的着色器代码,具有不透明度和数量

precision highp float;
uniform sampler2D inputImageTexture;
uniform sampler2D inputImageTexture2;
uniform float alpha;   // used for opacity....
uniform float amount;  // amount of blend....
varying vec2 textureCoordinate;

void main ()
{
    // Get samples from both layers
    vec4 dst = texture2D(inputImageTexture, textureCoordinate);
    vec4 src = texture2D(inputImageTexture2, textureCoordinate);

src.a *= alpha;
vec4 colour = vec4(0.0, 0.0, 0.0, 0.0);

colour = vec4(max(dst, src).rgb, src.a) * src.a + dst * (1.0 - src.a);
colour = clamp(colour, 0.0, 1.0);
gl_FragColor.xyz = mix(dst, colour, amount).rgb;
gl_FragColor.w = 1.0;
}

非常适合我……

我发现此着色器代码最适合我的情况:

lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate);
lowp vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate2);

textureColor.rgb *= textureColor.a;
textureColor2.rgb *= textureColor2.a;
lowp vec4 textureOut = max(textureColor, textureColor2);
textureOut.rgb /= textureOut.a;

gl_FragColor = textureOut;
可在此处找到:

precision highp float;
uniform sampler2D inputImageTexture;
uniform sampler2D inputImageTexture2;
uniform float alpha;   // used for opacity....
uniform float amount;  // amount of blend....
varying vec2 textureCoordinate;

void main ()
{
    // Get samples from both layers
    vec4 dst = texture2D(inputImageTexture, textureCoordinate);
    vec4 src = texture2D(inputImageTexture2, textureCoordinate);

src.a *= alpha;
vec4 colour = vec4(0.0, 0.0, 0.0, 0.0);

colour = vec4(max(dst, src).rgb, src.a) * src.a + dst * (1.0 - src.a);
colour = clamp(colour, 0.0, 1.0);
gl_FragColor.xyz = mix(dst, colour, amount).rgb;
gl_FragColor.w = 1.0;
}
lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate);
lowp vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate2);

textureColor.rgb *= textureColor.a;
textureColor2.rgb *= textureColor2.a;
lowp vec4 textureOut = max(textureColor, textureColor2);
textureOut.rgb /= textureOut.a;

gl_FragColor = textureOut;