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.