5

如何将 CIPixellate Core Image Filter 添加到 Sprite Kit 场景中?

我有一个 SpriteKit 场景,它是 SKScene 或其子类。我想在场景中添加一个核心图像过滤器。特别是一个 CIPixellate 过滤器,所以我可以免费拥有 8 位游戏天堂。

我怎么做?

4

1 回答 1

6

事实证明,这并不难。只是Core Image Filter文档过时且粗鲁,在SpriteKit的情况下,文档完全具有误导性或不完整,包括SKEffectNode文档。SKEffectNode文档对SKEffectNode的filter属性有这样的说法(截至本文):

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

嗯,这有点信息量,但信息量不是很大,因为核心图像过滤器目录说 CIPixellate 有以下参数键: 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"];

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

[aScene setShouldEnableEffects:YES];

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

[aScene setShouldCenterFilter:YES];

接下来添加过滤器。

[aScene setFilter:pixellateFilter];

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

从所有这些中,您可以注意到的一件事是 Core Image Filter 目录,尽管它很老,但确实告诉您各种过滤器是各种 CICategory 类型的成员,即使这些过滤器的文档也很差。但是您基本上可以假设在给定类别中有效的任何内容都意味着该类别中的其他过滤器也可能有效:)

于 2014-07-09T17:04:13.693 回答