首页 > 解决方案 > 在 iOS 上,你可以向一个 SpriteKit 节点添加多个 CIFilter 吗?

问题描述

在 iOS 上,你可以添加多个CIFilter到 aSKEffectsNode吗?

CIFilterGenerator似乎是我想要的,但它在 iOS 上不可用。

我知道您可以通过将一个的输出作为下一个的输入传递来在图像上使用多个过滤器,但是如果您想影响非图像节点,这将无济于事。

这是否意味着我必须创建一个人为的层次结构SKEffectNode并为它们中的每一个添加一个过滤器,而我的实际内容位于最底部?有没有更好的办法?

标签: iossprite-kitcore-imagecifilterskeffectnode

解决方案


按照 dfd 的有用建议,我最终选择了这个简单的子类。我将他的答案标记为正确,因为a)他建议了这种方法,我想给他荣誉,b)它有更多关于使用 CIFilterConstructor 注册过滤器的一般使用信息。

有用的参考资料: - Apple Docs -相关问题 -免费 Core Image 电子书

class MyChainFilter: CIFilter {
    let chainedFilters: [CIFilter]
    @objc dynamic var inputImage: CIImage?

    init(filters: [CIFilter]) {
        self.chainedFilters = filters
        super.init()
    }

    // run filters in order on the specified source image
    override var outputImage: CIImage? {
        get {
            let imageKey = "inputImage"
            var workingImage = self.inputImage
            for filter in chainedFilters {
                assert(filter.inputKeys.contains(imageKey))
                filter.setValue(workingImage, forKey: imageKey)
                guard let result = filter.outputImage else {
                    assertionFailure("filter failed: \(filter.name)")
                    return nil
                }
                workingImage = result
            }
            return workingImage
        }
    }

    required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") }
}

推荐阅读