事实证明这并不难。只是 Core Image Filter 文档过时且粗鲁,在 SpriteKit 的情况下,文档完全具有误导性或不完整,包括 SKEffectNode强>文档。
SKEffectNode 文档对 SKEffectNode 的 filter 属性有这样的说法(截至本文):
Core Image 过滤器必须有一个 inputImage 参数并产生一个 outputImage 参数。默认值为无。如果
值为 nil 且效果节点已启用,无需过滤
地方。但是,它的孩子仍然在一个单独的通道中渲染,并且
混合到父级的帧缓冲区。
嗯,这有点信息量,但信息量不是很大,因为核心图像过滤器目录说 CIPixellate 具有以下参数键:
输入图像
输入中心
输入刻度
它没有说明 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];
请注意,您可以在将其添加到父节点之前或之后以及在屏幕上之前或之后添加它。您甚至可以构建自定义 SKAction 来执行此操作... :)
从所有这些中,您可以注意到的一件事是 Core Image Filter 目录,尽管它很古老,但确实告诉您各种过滤器是各种 CICategory 类型的成员,即使这些过滤器的文档也很差。但是您基本上可以假设在给定类别中有效的任何东西都意味着该类别中的其他过滤器也可能有效:)