问题标签 [skeffectnode]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
3353 浏览

ios - SpriteKit中如何应用全屏SKEffectNode进行后期处理

我正在尝试使用以下设置的 SpriteKit:

  1. 具有两个子节点的 SKScene 仅用于对其他节点进行分组:前景和背景。
  2. 到目前为止,背景确实是空的,但最终会保存某种类型的背景精灵/图层。
  3. foreground 是一个 SKEffectNode,每当用户点击屏幕时,代表游戏元素的 SKnode 子类的新实例将作为子元素添加到其中。
  4. 这个 SKNode 子类基本上创建了 3 个 SKShapeNode 和两个标签:一个外圆周、一个内圆周、2 个标签和一个内四分之一圆周。内四分之一圆周有一个 SKAction,使其永远围绕其原点/中心旋转。

现在问题来了,只要前台没有任何 CIFilter 或 shouldEnableEffects = NO,一切都很好。也就是说,我可以点击屏幕,我的游戏元素被实例化并添加到主场景中。但是,当我尝试将 CIGaussianBlur 或 CIBloom 添加到前景时,我注意到两件事:

  1. 帧率下降到大约 2fps。请注意,即使场景中只有 6 个节点存活,也会发生这种情况。
  2. 效果似乎在不断地裁剪其内容或调整其框架。也就是说,如果我有一个节点,“全屏”效果似乎会尝试不断裁剪或调整其边界到容纳所有节点所需的最小区域。这是一个节点:

    在此处输入图像描述

这是针对 2 个节点的:

在此处输入图像描述

在 OpenGL ES 2 中,通过基本上将整个帧缓冲区(所有对象)渲染到纹理,然后在该纹理上至少再进行一次模糊等操作,然后将其呈现在附加到的帧缓冲区中,可以进行后期模糊/绽放显示或将其与原始渲染组合回帧缓冲区。我希望 SKEffectNode 以类似的方式工作。然而,裁剪和糟糕的性能让我认为我可能以错误的方式使用效果节点。有什么想法吗?

0 投票
3 回答
17186 浏览

ios - 如何通过 SKEffectNode 在精灵周围创建发光

我有一个SKSpriteNode我想在它的边缘周围发出蓝色的光芒以突出显示。我猜我需要让我的精灵成为 a 的孩子,SKEffectNode然后创建/应用某种过滤器。

更新:我已经用所选答案的方法对此进行了调查,发现SKEffectNode即使您将其设置为shouldRasterize并定义了“无过滤器”,它也会对性能产生相当大的影响。我的结论是,如果您的游戏一次需要超过 10 个移动对象,SKEffectNode即使光栅化,它们也不能涉及 a。

我的解决方案可能会涉及预渲染的发光图像/动画,因为 SKEffectNode 不会根据我的要求进行裁剪。

如果有人对我缺少的任何东西有洞察力,我会很高兴听到你所知道的一切!

我接受了一个答案,因为它确实实现了我的要求,但想将这些注释添加给任何想要走这条路的人,这样你就可以了解使用SKEffectNode.

0 投票
0 回答
489 浏览

sprite-kit - Custom CIFilter with SpriteKit

I'm trying to implement my own custom CIFilter with SpriteKit. What I would like to achieve is to use my custom CIFilter as the filter on a SKEffectNode.

I wrote a very simple test filter (just returns the pixelValue), and it works fine in QuartzComposer.

I followed the dev guide to write a CIFilter subclass, register the filter, and provide filterWithName and outputImage implementations, as well initialize and init.

However when I try using the CIFilter on my SKEffectNode, I don't get an output image (just a blank image - blank as in clearColor filled).

I don't think anything is wrong with my SKEffectNode setup because if I switch to another (built-in) CIFilter everything works as expected.

I also don't think there is anything wrong with the .cikernel since it runs fine in Quartz Composer (also it's really just one line that returns the pixelValue from the sample...)

I set breakpoints in the init and initialize of my CIFilter subclass, both get called, the kernel gets initialized with the correct code string, and everything since to be going fine.

However my output remains infuriatingly blank ...

Has anybody been successful in using custom CIFilters on SKEffectNodes ?

Thanks!

EDIT: forgot to mention that I do call [MyFilterSubclass class] to intialize it prior to using it, and I also set a breakpoint in -(CIImage *)outputImage and it does get called everyframe, so it looks like the filter is setup correctly and it's computing a result every frame, but that result somehow doesn't get used by the SKEffectNode... help :( !

0 投票
3 回答
2643 浏览

ios - SKEffectNode 有问题

我正在关注Apple的SpriteKit文档,现在我正在尝试使用SKEffectNode,但我的问题是效果不会被应用!这是我的代码:

当您运行该应用程序时,它只会显示宇宙飞船而没有任何模糊效果。

0 投票
1 回答
254 浏览

ios - 带有纹理动画的 SKEffectNode 不起作用

尝试这个:

  1. 创建一个 SKEffectNode 类
  2. 制作一个小动画,8帧左右,放入atlas文件夹
  3. 将此代码添加到类初始化

初始化类

将此节点添加到您的场景中。结果是什么都没有渲染。请注意,我什至还没有启用效果。

为什么?

0 投票
1 回答
1138 浏览

ios - 在 SKEffectNode 中设置自定义 CIColorCube 过滤器

我正在尝试创建一个 SKEffectNode,它将使黑色背景上的任何绿色像素变为透明。出于测试目的,当我弄清楚这些东西时,我想确保以下代码不会在 SKEffectNode 的子树中变得透明。以下代码实际上阻止了孩子被绘制,并吐出以下错误:

CIColorCube inputCubeData is not of the expected length.

这就是创建SKEffectNode

这就是我设置过滤器的方式(大多数,或者我敢说所有这些代码都在Apple 的开发文档中)。

我只是无法发现问题。CoreImage 的经验并不多。任何人?

更新 1

我尝试将整个 CIFilter 导出到它自己的类中。

在运行时我仍然有同样的错误

0 投票
0 回答
330 浏览

ios - 如何旋转具有 SKEffectNode 子节点的 SKNode

我有一个SKNode我想用它来组织一些其他的SKSpriteNodesSKEffectNodes. 最终目标是让角色精灵可以改变其身体部分的颜色(因此SKEffectNode)以及许多其他行为(因此将它们全部添加到父级SKNode

SKNode出于组织和学习的原因,我想组织复杂和复合的行为。

这是我的代码:

当它运行并调用旋转方法时(例如从场景中的 touchesBegan 调用),红色 shape1 按预期旋转,但绿色 shape2 有点疯狂。看起来,它似乎是先通过 X 再通过 Y 缩放,但没有旋转。

这是起始图像 这是起始图像

并经过一些旋转 并经过一些旋转

我已经尝试记录所有节点的 zRotation,父节点已更新,所有子节点都保持在 0.0。这是我所期望的。

我知道我可以更改 shape2 节点的颜色来解决这个特定问题,但我仍然想了解未来会发生什么。

我知道,当我SKEffectNode从等式中取出时,一切都按预期工作,所以我的问题是如何SKEffectNode在此节点树中使用 an 并让父级以理智的方式响应 zRotation ?

我的一个想法是问题在于CIFilter基于存储的 inputImage 的渲染输出,它不会旋转,但我现在真的在猜测。

0 投票
0 回答
1982 浏览

ios - SpriteKit - SKEffectnode 混合模式、光栅化和帧速率

我正在尝试使用 SKEffectnode 在横向滚动游戏中做一些简单的照明。首先,我制作了一个灰色的全屏精灵节点,将其混合模式设置为加法,并将其作为子节点添加到效果节点。然后我添加一些带有一些轻质纹理的精灵节点,也作为效果节点的子节点。最后,我将效果节点的混合模式设置为乘法,并将其作为子节点添加到我的场景中。像这样的东西:

所以我的问题是效果节点的混合模式似乎没有做任何事情。就像它卡在 alpha 混合模式或什么的。但是,如果我将 shouldRasterize 设置为 YES,则混合模式开始按预期工作。有人知道为什么吗?

还添加这样的全屏效果,带有效果节点,完全破坏了帧速率。特别是如果您开始移动效果节点(或每帧创建一个新节点)。但是我在 sprite kit 中看不到任何其他像这样的照明方式。我基本上想每帧创建一个光照遮罩,然后将其乘以场景的帧缓冲区。使用 Sprite Kit 可以实现这样的事情吗?或者我应该使用自定义着色器查看 Cocos2d 吗?

0 投票
2 回答
1340 浏览

ios - 将 SKScene 渲染到 SKTexture?

Sprite Kit 中有没有一种方法可以将屏幕(所有当前SKScene渲染的节点)捕获到一个SKTexture,以便我可以应用 CIFilter,然后将 SKTexture 分配回一个新的SKSpriteNode

我知道我可以设置一个SKEffectNode, 作为我的节点树的父级,应用一个过滤器等并以这种方式获得结果,但我真的需要一个过滤 SKTexture(或SKSpriteNode)我以后可以重用?

编辑:

可能的解决方案:

是的,有效:

0 投票
3 回答
2393 浏览

ios - 使用 SKEffectNode 逐渐模糊 SKShapeNode

我试图在我的程序中模糊一个 SKShapenode。但是,我希望 shapenode 逐渐模糊,持续时间约为 1 秒。我该如何做到这一点?当前的代码立即模糊了它。