ios - 在 iOS 上,你可以向一个 SpriteKit 节点添加多个 CIFilter 吗?
问题描述
在 iOS 上,你可以添加多个CIFilter
到 aSKEffectsNode
吗?
CIFilterGenerator
似乎是我想要的,但它在 iOS 上不可用。
我知道您可以通过将一个的输出作为下一个的输入传递来在图像上使用多个过滤器,但是如果您想影响非图像节点,这将无济于事。
这是否意味着我必须创建一个人为的层次结构SKEffectNode
并为它们中的每一个添加一个过滤器,而我的实际内容位于最底部?有没有更好的办法?
解决方案
按照 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") }
}
推荐阅读
- matlab - 如何使用 LaTeX 解释器在 MATLAB 图形中使颜色条的刻度变为粗体?
- angularjs - 不允许超过 md-maxlength="200"
- c++ - 为什么 std::function 不能从 lambda 移动构造?
- c# - Npgsql.NpgsqlException: '没有提供密码
- java - 一段时间后从后台恢复时,Android应用布局组件为空
- java - MySQLNonTransientConnectionException:连接关闭后不允许任何操作。
- python - Python中的XOR RGB图像解密
- html - 将鼠标悬停在父 div 上时 CSS 淡化子元素,然后将鼠标悬停在子元素上时再次更改
- vue.js - 从另一个模块访问 vuex 模块状态
- python - 如何将我的 Google Blogger 文件导入 Pelican 而不会出错?