CIFilter高斯模糊在iOS9.x上似乎存在问题(与SKEffectNode一起使用)

3
我正在尝试使用以下代码片段创建模糊效果:
  let glowEffectNode = SKEffectNode()
  glowEffectNode.shouldRasterize = true

  let glowSize = CGSize(width: barSize.width, height: barSize.height)
  let glowEffectSprite = SKSpriteNode(color: barColorData.topColor, size: glowSize)
  glowEffectNode.addChild(glowEffectSprite)

  let glowFilter = CIFilter(name: "CIGaussianBlur")
  glowFilter!.setDefaults()
  glowFilter!.setValue(5, forKey: "inputRadius")

  glowEffectNode.filter = glowFilter

当然,它在iOS 8.x上运行得非常完美,但从iOS 9.x开始(我已经在9.0和9.1上尝试过),模糊效果无法正常工作。 (在模拟器上,节点似乎有点透明,但绝对不模糊,在设备上它看起来模糊但被裁剪了,并且与其中心位置有偏移:/)

是否有一种快速的方式使用CIFilter来修复这个问题?


一般来说,CIFilter(即Core Image框架)是有问题的,还是只针对于SKEffectNode(SpriteKit框架)有问题呢?根据答案不同,我会稍微修改一下问题的标题。另外,感谢您提供的解决方案。 - Nicolas Miari
@NicolasMiari 我只是用SpriteKit测试过它。 - giorashc
我想知道在Mac OS方面的情况如何... - Nicolas Miari
从我所了解的情况来看,SpriteKit和iOS 9中出现了许多问题。有些问题可以通过采用更好的实践方法来避免(即,一些以前没有出现问题的东西,但实际上应该会出现问题),而其他一些问题似乎是Apple的明显错误。 - Nicolas Miari
1个回答

1

我进一步尝试了一下,并找到了解决方案...

首先,似乎使用奇数的模糊半径会导致整个节点被渲染出现偏移(???),因此例如使用10可以修复偏移问题。

其次,由于整个节点是被渲染成精灵的,而对于模糊效果需要额外的空间,因此我使用透明精灵作为额外的空间,下面的代码片段现在可以工作:

let glowEffectNode = SKEffectNode()
glowEffectNode.shouldRasterize = true

let glowBackgroundSize = CGSize(width: barSize.width + 60, height: barSize.height + 60)
let glowSize = CGSize(width: barSize.width + 10, height: barSize.height + 10)
let glowEffectSprite = SKSpriteNode(color: barColorData.topColor, size: glowSize)
glowEffectNode.addChild(SKSpriteNode(color: SKColor.clearColor(), size: glowBackgroundSize))
glowEffectNode.addChild(glowEffectSprite)

let glowFilter = CIFilter(name: "CIGaussianBlur")
glowFilter!.setDefaults()
glowFilter!.setValue(10, forKey: "inputRadius")

glowEffectNode.filter = glowFilter

我应该提到,我正在使用 view.textureFromNode(glowEffectNode) 从此节点创建纹理以提高效率,但我尝试过直接使用节点本身,问题仍然存在,因此上述方法应该有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接