Ios 如何将GPUImageAlphaBlendFilter添加到GPUImageFilterGroup

Ios 如何将GPUImageAlphaBlendFilter添加到GPUImageFilterGroup,ios,gpuimage,Ios,Gpuimage,我正在做一个需要一组效果的项目 根据FilterShowcase中的示例,我成功地使用了filterGroup,如下所示: filter = [[GPUImageFilterGroup alloc] init]; GPUImageSepiaFilter *sepiaFilter = [[GPUImageSepiaFilter alloc] init]; [(GPUImageFilterGroup *)filter addFilter:sepiaFilter]; GPUImagePixella

我正在做一个需要一组效果的项目

根据FilterShowcase中的示例,我成功地使用了filterGroup,如下所示:

filter = [[GPUImageFilterGroup alloc] init];

GPUImageSepiaFilter *sepiaFilter = [[GPUImageSepiaFilter alloc] init];
[(GPUImageFilterGroup *)filter addFilter:sepiaFilter];

GPUImagePixellateFilter *pixellateFilter = [[GPUImagePixellateFilter alloc] init];
[(GPUImageFilterGroup *)filter addFilter:pixellateFilter];

[sepiaFilter addTarget:pixellateFilter];
[(GPUImageFilterGroup *)filter setInitialFilters:[NSArray arrayWithObject:sepiaFilter]];
[(GPUImageFilterGroup *)filter setTerminalFilter:pixellateFilter]; code here
GPUImageCrosshairGenerator *crosshairGenerator = [[GPUImageCrosshairGenerator alloc] init];
crosshairGenerator.crosshairWidth = 15.0;
[crosshairGenerator forceProcessingAtSize:CGSizeMake(480.0, 640.0)];

[(GPUImageHarrisCornerDetectionFilter *)filter setCornersDetectedBlock:^(GLfloat* cornerArray, NSUInteger cornersDetected, CMTime frameTime) {
    [crosshairGenerator renderCrosshairsFromArray:cornerArray count:cornersDetected frameTime:frameTime];
}];

GPUImageAlphaBlendFilter *blendFilter = [[GPUImageAlphaBlendFilter alloc] init];
[blendFilter forceProcessingAtSize:CGSizeMake(480.0, 640.0)];
GPUImageGammaFilter *gammaFilter = [[GPUImageGammaFilter alloc] init];
[videoCamera addTarget:gammaFilter];
[gammaFilter addTarget:blendFilter];

[crosshairGenerator addTarget:blendFilter];

[blendFilter addTarget:filterView];
filter=  [[GPUImageParticleGroupTest alloc] init];
[filter addTarget:filterView];
[videoCamera addTarget:filter];
但现在我想在组中添加一个新的过滤器,如
GPUIMAGE\u HARRISCORNERDETECTION
此过滤器还需要混合

以下是过滤器初始化:

filter = [[GPUImageHarrisCornerDetectionFilter alloc] init];
[(GPUImageHarrisCornerDetectionFilter *)filter setThreshold:0.20];     
然后它需要如下混合:

filter = [[GPUImageFilterGroup alloc] init];

GPUImageSepiaFilter *sepiaFilter = [[GPUImageSepiaFilter alloc] init];
[(GPUImageFilterGroup *)filter addFilter:sepiaFilter];

GPUImagePixellateFilter *pixellateFilter = [[GPUImagePixellateFilter alloc] init];
[(GPUImageFilterGroup *)filter addFilter:pixellateFilter];

[sepiaFilter addTarget:pixellateFilter];
[(GPUImageFilterGroup *)filter setInitialFilters:[NSArray arrayWithObject:sepiaFilter]];
[(GPUImageFilterGroup *)filter setTerminalFilter:pixellateFilter]; code here
GPUImageCrosshairGenerator *crosshairGenerator = [[GPUImageCrosshairGenerator alloc] init];
crosshairGenerator.crosshairWidth = 15.0;
[crosshairGenerator forceProcessingAtSize:CGSizeMake(480.0, 640.0)];

[(GPUImageHarrisCornerDetectionFilter *)filter setCornersDetectedBlock:^(GLfloat* cornerArray, NSUInteger cornersDetected, CMTime frameTime) {
    [crosshairGenerator renderCrosshairsFromArray:cornerArray count:cornersDetected frameTime:frameTime];
}];

GPUImageAlphaBlendFilter *blendFilter = [[GPUImageAlphaBlendFilter alloc] init];
[blendFilter forceProcessingAtSize:CGSizeMake(480.0, 640.0)];
GPUImageGammaFilter *gammaFilter = [[GPUImageGammaFilter alloc] init];
[videoCamera addTarget:gammaFilter];
[gammaFilter addTarget:blendFilter];

[crosshairGenerator addTarget:blendFilter];

[blendFilter addTarget:filterView];
filter=  [[GPUImageParticleGroupTest alloc] init];
[filter addTarget:filterView];
[videoCamera addTarget:filter];
是否有方法将
GPUImageCrosshairGenerator
GPUImageAlphaBlendFilter
,&
GPUImageGammaFilter
添加到过滤器组

多谢各位

更具体的细节如下:

=============================================

基于FilterShowcase的代码示例: 测试类GPUImageDrawTriangleTest只是在实时视频源上绘制随机三角形

self.title = @"DRAWING TRIANGLES TESTING";

triangleFilter = [[GPUImageDrawTriangleTest alloc] init];
[((GPUImageDrawTriangleTest *)particleFilter) setDrawColorRed:1.0 green:0.0 blue:1.0];

filter = [[GPUImageContrastFilter alloc] init];

__unsafe_unretained GPUImageDrawTriangleTest *weakGPUImageTestCust = (GPUImageDrawTriangleTest *)triangleFilter;

[filter  setFrameProcessingCompletionBlock:^(GPUImageOutput * filter, CMTime frameTime){
    [weakGPUImageTestCust update:frameTime];
}];

blendingFilters = TRUE;

blendFilter = nil;
blendFilter = [[GPUImageAlphaBlendFilter alloc] init];
[blendFilter forceProcessingAtSize:CGSizeMake(640.0, 480.0)];

GPUImageGammaFilter *gammaFilter = [[GPUImageGammaFilter alloc] init];

[videoCamera addTarget:gammaFilter];
[gammaFilter addTarget:blendFilter];

blendFilter.mix = 1.0;

[triangleFilter  addTarget:blendFilter];
[filter  addTarget:blendFilter];

[blendFilter addTarget:filterView];

[filter  addTarget:filterView];

[videoCamera addTarget:filter];
基于FilterShowcase示例和
GPUImageUnsharpMaskFilter
组的模板,我创建了
GPUImageParticleGroupTest

#import "GPUImageParticleGroupTest.h"

#import "GPUImageFilter.h"
#import "GPUImageGammaFilter.h"
#import "GPUImageDrawTriangleTest.h"
#import "GPUImageContrastFilter.h"
#import "GPUImageAlphaBlendFilter.h"

#import "GPUImageDrawTriangleTest.h"

@implementation GPUImageParticleGroupTest
    - (id)init;
{
    if (!(self = [super init]))
    {
        return nil;
    }

    contrastFilter = [[GPUImageContrastFilter alloc] init];
    [self addFilter:contrastFilter];

    gammaFilter = [[GPUImageGammaFilter alloc] init];
    [self addFilter:gammaFilter];

    triangleFilter = [[GPUImageDrawTriangleTest alloc] init];
    [((GPUImageDrawTriangleTest *)triangleFilter) setDrawColorRed:1.0 green:0.0 blue:1.0];

    //[self addFilter:triangleFilter];

    __unsafe_unretained GPUImageDrawTriangleTest *weakGPUImageTestCust = (GPUImageDrawTriangleTest *)triangleFilter;

    [ contrastFilter  setFrameProcessingCompletionBlock:^(GPUImageOutput * contrastfilter, CMTime frameTime){
        [weakGPUImageTestCust update:frameTime];
    }];

    theblendFilter = [[GPUImageAlphaBlendFilter alloc] init];
    theblendFilter.mix = 1.0;
    [self addFilter:theblendFilter];

    [gammaFilter addTarget:theblendFilter  atTextureLocation:1];

    [triangleFilter  addTarget:theblendFilter  atTextureLocation:1];

    [contrastFilter  addTarget:theblendFilter  atTextureLocation:1];


    self.initialFilters = [NSArray arrayWithObjects:contrastFilter,gammaFilter, nil];
    self.terminalFilter = theblendFilter;

    return self;
}
@end
其目的是当该组类被实例化时,如下所示:

filter = [[GPUImageFilterGroup alloc] init];

GPUImageSepiaFilter *sepiaFilter = [[GPUImageSepiaFilter alloc] init];
[(GPUImageFilterGroup *)filter addFilter:sepiaFilter];

GPUImagePixellateFilter *pixellateFilter = [[GPUImagePixellateFilter alloc] init];
[(GPUImageFilterGroup *)filter addFilter:pixellateFilter];

[sepiaFilter addTarget:pixellateFilter];
[(GPUImageFilterGroup *)filter setInitialFilters:[NSArray arrayWithObject:sepiaFilter]];
[(GPUImageFilterGroup *)filter setTerminalFilter:pixellateFilter]; code here
GPUImageCrosshairGenerator *crosshairGenerator = [[GPUImageCrosshairGenerator alloc] init];
crosshairGenerator.crosshairWidth = 15.0;
[crosshairGenerator forceProcessingAtSize:CGSizeMake(480.0, 640.0)];

[(GPUImageHarrisCornerDetectionFilter *)filter setCornersDetectedBlock:^(GLfloat* cornerArray, NSUInteger cornersDetected, CMTime frameTime) {
    [crosshairGenerator renderCrosshairsFromArray:cornerArray count:cornersDetected frameTime:frameTime];
}];

GPUImageAlphaBlendFilter *blendFilter = [[GPUImageAlphaBlendFilter alloc] init];
[blendFilter forceProcessingAtSize:CGSizeMake(480.0, 640.0)];
GPUImageGammaFilter *gammaFilter = [[GPUImageGammaFilter alloc] init];
[videoCamera addTarget:gammaFilter];
[gammaFilter addTarget:blendFilter];

[crosshairGenerator addTarget:blendFilter];

[blendFilter addTarget:filterView];
filter=  [[GPUImageParticleGroupTest alloc] init];
[filter addTarget:filterView];
[videoCamera addTarget:filter];
我会得到同样的结果,在现场视频上画同样的随机三角形。该应用程序没有崩溃,但我不再获得任何实时视频或三角形


我哪里出错了?

当处理需要将输入图像与组内生成的内容混合的GPUImageFilterGroup时,您只需要处理另一件事,那就是确保以正确的顺序将目标添加到混合中

以GPUImageUnsharpMaskFilter为例。它将输入帧带入该组,将其通过模糊过滤器,然后将该模糊过滤器的输出与输入图像混合。要进行设置,它使用以下代码:

// First pass: apply a variable Gaussian blur
blurFilter = [[GPUImageGaussianBlurFilter alloc] init];
[self addFilter:blurFilter];

// Second pass: combine the blurred image with the original sharp one
unsharpMaskFilter = [[GPUImageTwoInputFilter alloc] initWithFragmentShaderFromString:kGPUImageUnsharpMaskFragmentShaderString];
[self addFilter:unsharpMaskFilter];

// Texture location 0 needs to be the sharp image for both the blur and the second stage processing
[blurFilter addTarget:unsharpMaskFilter atTextureLocation:1];

self.initialFilters = [NSArray arrayWithObjects:blurFilter, unsharpMaskFilter, nil];
self.terminalFilter = unsharpMaskFilter;
这里使用的一种新方法是
-addTarget:atTextureLocation:
,它确保将输入图像添加为模糊过滤器和后续混合的第一个输入。还要注意,此组有两个initialFilters,以确保输入图像指向这两个过滤器


您需要对上面的代码执行类似的操作,将输入输入输入Harris角点检测器以及混合。基于您已经从FilterShowcase示例中获得的代码和GPUImageUnsharpMaskFilter组的模板,这应该相当简单。

感谢您的快速响应。我会试试这个。嗨,布拉德,我试过这个,我肯定错过了什么,我补充了更多细节。非常感谢您的帮助。@learning ios-我不知道您在那个示例中想做什么。为什么要尝试在混合中使用三个过滤器?为什么要将它们设置为相同的纹理输入?这显然行不通。您是否尝试将对比度过滤器链接到gamma过滤器,然后将其与三角形生成器混合?如果是这样,将对比度过滤器设置为唯一的初始过滤器,将其设置为gamma过滤器的目标,并将其设置为混合处的三角形生成器的目标。不用担心纹理输入,因为这只适用于需要将输入图像分支到不同过滤器的情况。