CIFilter GaussianBlur似乎在iOS9.x上被破坏(与SKEffectNode一起使用)

时间:2015-10-31 19:40:55

标签: sprite-kit ios9 cifilter

我正在尝试使用以下代码段创建模糊效果:

  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有一种快速解决方法吗?

1 个答案:

答案 0 :(得分:1)

我用这个摆弄了一点,找到了解决方案......

首先,似乎使用奇数作为模糊半径会导致整个节点使用偏移(???)进行渲染,因此使用10来修复偏移问题。

其次,似乎模糊被裁剪,因为整个节点是渲染的精灵,对于模糊效果,你需要一个额外的空间,所以我使用透明的精灵来获得额外的空间,下面的代码片段现在可以工作:

class AmazonItem(models.Model):
    amazon_url = models.CharField(max_length=800, null=True, blank=True)
    price = models.DecimalField(max_digits=6, decimal_places=2, editable=False)
    last_update = models.DateTimeField(editable=False)

def save(self):
    if not self.id:
        if self.amazon_url:
            url = self.amazon_url
            source_code = requests.get(url)
            code = html.fromstring(source_code.text)
            prices = code.xpath('//span[@id="priceblock_ourprice"]/text()')
            eur = prezzi[0].replace("EUR ", "")
            nospace = eur.replace(" ", "")
            nodown = nospace.replace("\n", "")
            end = nodown.replace(",", ".")
            self.price = float(end)
        else:
            self.price = 0

    self.last_update = datetime.datetime.today()
    super(AmazonItem, self).save()

我应该提到我正在使用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 从这个节点创建纹理以提高效率,但我尝试使用节点本身并且问题仍然存在,所以无论如何