Search code examples
iossprite-kitskspritenodecifiltersktexture

CIFilter (CIStripesGenerator) with SKTexture?


I am trying to get a strips generated using CIFilter, then create a SKTexture from it. Here is my code.

      CIFilter *filter = [CIFilter filterWithName:@"CIStripesGenerator"];
    [filter setDefaults];
    [filter setValue:[CIColor colorWithRed:1 green:1 blue:1] forKey:@"inputColor0"];
    [filter setValue:[CIColor colorWithRed:0 green:0 blue:0] forKey:@"inputColor1"];

   //updated the code, whith this line   
   //stil the same problem
    CIImage *croppedImage = [filter.outputImage imageByCroppingToRect:CGRectMake(0, 0, 320, 480)];

    SKTexture *lightTexture = [SKTexture textureWithImage:[UIImage imageWithCIImage:croppedImage]];

    SKSpriteNode *light = [SKSpriteNode spriteNodeWithTexture:lightTexture size:self.size];

However, i receive a run time error at the last line, any help would be appreciated, except for (lldb), the compiler does not give any more explanation.

UPDATE: Thanks to rickster for guiding me towards the solution

-(UIImage*) generateImage {
// 1
CIContext *context = [CIContext contextWithOptions:nil];
CIFilter *filter = [CIFilter filterWithName:@"CIStripesGenerator"];
[filter setDefaults];
[filter setValue:[CIColor colorWithRed:1 green:1 blue:1] forKey:@"inputColor0"];
[filter setValue:[CIColor colorWithRed:0 green:0 blue:0] forKey:@"inputColor1"];
// 2
CGImageRef cgimg =
[context createCGImage:filter.outputImage fromRect:CGRectMake(0, 0, 320, 480)];
// 3
UIImage *newImage = [UIImage imageWithCGImage:cgimg];
// 4
CGImageRelease(cgimg);
return newImage;
 }

Then, i can create texture from the image:

    SKTexture *stripesTexture = [SKTexture textureWithImage:[self generateImage]];

    SKSpriteNode *stripes = [SKSpriteNode spriteNodeWithTexture:stripesTexture];
    stripes.position=CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame));
    [self addChild: stripes];

Solution

  • There are a couple of issues here:

    1. You don't have a Core Image context for rendering your image. Create one with:

      CIContext *context = [CIContext contextWithOptions:nil];
      

      This probably won't provide real-time rendering performance. But it looks like you just want one-time generation of a static texture, so that's okay.

    2. Most of the generator filters produce images of infinite extent. You need to either add a crop filter to the filter chain, or render your image using a method that lets you specify what rect of the image you want, like createCGImage:fromRect:. Then make an SKTexture from the resulting CGImageRef.