SKEffectNode到SKTexture?

SKEffectionNodes有一个shouldRasterise“switch”,它将它们烘焙到位图中,并且直到受效果影响的底层节点发生更改时才更新它们。

但是我找不到从这个光栅化的“图像”创建SKTexture的方法。

是否可以从SKEffectNode获取SKEffectNode

我想你可以尝试这样的代码(这只是一个例子):

 if let effect = SKEffectNode.init(fileNamed: "myeffect") { effect.shouldRasterize = true self.addChild(effect) ... let texture = SKView().texture(from: self) } 

更新

在你回答之后,希望我能更好地理解你想要实现的目标。

这是我的观点:如果你想制作一个纹理的阴影,你可以简单地用这个纹理创建一个SKSpriteNode

 let shadow = SKSpriteNode.init(texture: ) shadow.blendMode = SKBlendMode.alpha shadow.colorBlendFactor = 1 shadow.color = SKColor.black shadow.alpha = 0.25 

我想说的是你可以一步一步地进行:

  • 得到你的纹理
  • 详细说明你的纹理(添加filter,做一些其他的效果..)
  • 得到影子

这种工作方式产生了一系列有用的方法,您可以在项目中使用这些方法来构建其他类型的元素。 也许,通过分离任务你不需要使用texture(from:)

我用一种工厂解决了我的问题。

阅读更多关于如何建立工厂的信息,来自BenMobile的耐心和明确的清晰度,这里: 工厂创建和用于制作精灵和形状

模糊SKTextureSKSpriteNode存在一个问题,即它将耗尽空间。 模糊/发光超出了精灵的边缘。 要解决这个问题,在下面,你会看到我创建了一个“成帧器”对象。 这只是一个空的SKSpriteNode ,它的大小是要模糊的纹理的两倍。 要模糊的纹理作为子项添加到此“成帧器”对象。

它是有效的,无论这是多么的hacky;)

在静态工厂类文件中:

 import SpriteKit class Factory { private static let view:SKView = SKView() // the magic. This is the rendering space static func makeShadow(from source: SKTexture, rgb: SKColor, a: CGFloat) -> SKSpriteNode { let shadowNode = SKSpriteNode(texture: source) shadowNode.colorBlendFactor = 0.5 // near 1 makes following line more effective shadowNode.color = SKColor.gray // makes for a darker shadow. White for "glow" shadow let textureSize = source.size() let doubleTextureSize = CGSize(width: textureSize.width * 2, height: textureSize.height * 2) let framer = SKSpriteNode(color: UIColor.clear, size: doubleTextureSize) framer.addChild(shadowNode) let blurAmount = 10 let filter = CIFilter(name: "CIGaussianBlur") filter?.setValue(blurAmount, forKey: kCIInputRadiusKey) let fxNode = SKEffectNode() fxNode.filter = filter fxNode.blendMode = .alpha fxNode.addChild(framer) fxNode.shouldRasterize = true let tex = view.texture(from: fxNode) // 'view' refers to the magic first line let shadow = SKSpriteNode(texture: tex) //WHOOPEE!!! TEXTURE!!! shadow.colorBlendFactor = 0.5 shadow.color = rgb shadow.alpha = a shadow.zPosition = -1 return shadow } } 

在任何地方你都可以访问你想要制作阴影或发光纹理的精灵:

 shadowSprite = Factory.makeShadow(from: button, rgb: myColor, a: 0.33) shadowSprite.position = CGPoint(x: self.frame.midX, y: self.frame.midY - 5) addChild(shadowSprite) 

button是要赋予阴影的按钮的纹理。 a:是一个alpha设置(实际上是透明度级别,0.0到1.0,其中1.0是完全不透明的),它越低,阴影就越亮。

定位用于将阴影略微放在按钮下方,因此看起来光线从顶部射出,将阴影向下投射到背景上。