How to apply custom cifilter to SCNNode

48 views Asked by At

When applying a built-in CIFilter on an SCNNode, there is no problem. like this:

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

node.filters = @[bloomFilter]

However, when applying a custom filter on an SCNNode, the node is missing. like this:

@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 );
}

The custom filter code has been debugged, and the inputImage is not nil and extent data seem to be fine. However, the inputImage appears as a full transparency picture.

After applying a custom filter on node, the node is missing.

I am also confused about how the inputImage be assigned.

Any help would be appreciated. Thank you.

0

There are 0 answers