如何将CIPixellate核心图像过滤器添加到Sprite Kit场景?

uch*_*aka 5 core-image cifilter sprite-kit skscene cipixellate

如何将CIPixellate核心图像过滤器添加到Sprite Kit场景?

我有一个SpriteKit场景,它是SKScene或它的子类.我想在场景中添加Core Image滤镜.特别是一个CIPixellate过滤器,所以我可以免费获得8位游戏天堂.

我怎么做?

uch*_*aka 6

事实证明这并不难.这只是在核心图像过滤器的文档是旧的和这些混沌的情况下SpriteKit,该文档是平了误导性或不完整的,包括SKEffectNode文档.该SKEffectNode文档都这样说(因为这个职位的)对过滤器的性能SKEffectNode:

Core Image过滤器必须具有单个inputImage参数,并生成单个outputImage参数.默认值为nil.如果值为nil并且启用了效果节点,则不会进行过滤.但是,它的子节点仍然在单独的传递中渲染并混合到父节点的帧缓冲区中.

好吧,这有点信息,但不是非常丰富的信息,因为核心图像过滤器目录说CIP​​ixellate有以下参数键: inputImage inputCenter inputScale 它没有说任何关于outputImage或inputScale是"像素化".

嗯,那就是......让我们看看如何.

首先,请注意SKScene继承自SKEffectNode.这意味着你可以添加CIFilters.真棒.

你需要做的就是这个.

首先创建一个CIFilter.

CIFilter *pixellateFilter;
pixellateFilter = [CIFilter filterWithName:@"CIPixellate"];
[pixellateFilter setDefaults]; // Remember to setDefaults...
// We could change some value but for this one we won't.
//  [pixellateFilter setValue:@(10.0) forKey:@"inputScale"];
Run Code Online (Sandbox Code Playgroud)

然后配置您的SKEffectNode以实际渲染效果!

[aScene setShouldEnableEffects:YES];
Run Code Online (Sandbox Code Playgroud)

将过滤器居中并不是一个坏主意.但你的里程可能会有所不同

[aScene setShouldCenterFilter:YES];
Run Code Online (Sandbox Code Playgroud)

接下来添加过滤器.

[aScene setFilter:pixellateFilter];
Run Code Online (Sandbox Code Playgroud)

请注意,您可以在将其添加到父节点之前或之后以及屏幕之前或之后添加此项.您甚至可以构建自定义SKActions来执行此操作... :)

从所有这一点来看,你可以注意到的一件事是核心图像过滤器目录,尽管它已经老了,但它确实告诉你各种过滤器是各种CICategory类型的成员,即使这些过滤器也很难记录.但是你基本上可以假设任何在给定类别中起作用的东西意味着该类别中的其他过滤器也可以工作:)