如何将自定义 cifilter 应用于 SCNNode

问题描述 投票:0回答:0

在 SCNNode 上应用内置的 CIFilter 时,没有问题。 像这样:

CIFilter *bloomFilter = [CIFilter bloomFilter];
[bloomFilter setValue: @(2) forKey: kCIInputIntensityKey];
[bloomFilter setValue: @(40) forKey: kCIInputRadiusKey];

node.filters = @[bloomFilter]

但是,在 SCNNode 上应用自定义过滤器时,该节点丢失了。 像这样:

@interface CustomFilter : CIFilter

@property(nonatomic, strong) CIKernel *kernel;
@property(nonatomic, strong) CIImage *inputImage;

@end

@implementation CustomFilter


- (CIKernel *)kernel {
    if (!_kernel) {
        NSBundle *bundle = [NSBundle mainBundle];  
        NSURL *kernelURL = [bundle URLForResource:@"mirrorX" withExtension:@"cikernel"];
        
        NSError *error;
        NSString *kernelCode = [NSString stringWithContentsOfURL:kernelURL
                                                        encoding:NSUTF8StringEncoding error:&error];
        if (kernelCode == nil) {
            NSLog(@"Error loading kernel code string in %@\n%@",
                  NSStringFromSelector(_cmd),
                  [error localizedDescription]);
        }
        _kernel =  [CIKernel kernelWithString:kernelCode];

    }
    return _kernel;
}

- (CIImage *)outputImage {

    return [(CIWarpKernel *)self.kernel applyWithExtent:self.inputImage.extent
                            roiCallback:^CGRect(int index, CGRect destRect) {
                                return destRect;
                            }
                             inputImage:self.inputImage
                              arguments:@[@(self.inputImage.extent.size.width)]];
}

@end
kernel vec2 mirrorX ( float imageWidth )
{
      vec2 currentVec = destCoord();
      return vec2 ( imageWidth - currentVec.x , currentVec.y );
}

自定义过滤器代码已调试,inputImage不为nil,extent数据好像没问题。但是,inputImage 显示为全透明图片。

在节点上应用自定义过滤器后,节点丢失。

我也对 inputImage 的分配方式感到困惑。

任何帮助将不胜感激。谢谢。

ios arkit cifilter scnnode
© www.soinside.com 2019 - 2024. All rights reserved.