SKShader创建视差背景

时间:2016-12-08 18:26:34

标签: sprite-kit swift3 parallax fragment-shader

使用固定相机的视差背景很容易做到,但由于我正在制作自上而下的2D空间探索游戏,我认为只有一个SKSpriteNode填充屏幕并成为我的SKCameraNode的孩子并使用SKShader画一个视差星场会更容易。

我继续使用shadertoy并找到了这个简单的着色器。我在shadertoy上成功地对它进行了调整,以接受一个vec2()来表示我想要作为SKAttribute传递的运动速度,以便它可以跟随我的船的移动。

以下是原始资料来源: https://www.shadertoy.com/view/XtjSDh

我设法转换原始代码,因此编译时没有任何错误,但屏幕上没有显示任何内容。我尝试了各个功能,他们确实可以生成固定的图像。

任何使其有效的指针?

谢谢!

2 个答案:

答案 0 :(得分:1)

这不是一个真正的答案,但它比评论更多的信息,并突出了SK如何处理粒子的一些奇怪和适当性:

SceneKit中的粒子有几个奇怪的东西,可能适用于SpriteKit。

  1. 移动粒子系统时,可以让粒子随之移动。这是默认行为:
  2. 来自文档:

      

    当发射器创建粒子时,它们将被渲染为子粒子   发射器节点。这意味着他们继承了这一特征   发射器节点,就像节点一样。例如,如果你旋转   发射器节点,所有产生的粒子的位置   也旋转了。取决于你用它模拟的效果   发射器,这可能不是正确的行为。

    对于大多数应用程序,事实上这是错误的行为。但是对于你想要做的事情,这是理想的。您可以将新的SKNodeEmitters定位在船舶前进的位置,并将它们固定到“空间”,以便它们与玩家船舶的方向变化一起旋转,并且粒子将完全按照您的需要或需要创建移动的感觉整个空间。

    1. SpriteKit以推进模拟的形式具有预建或填充功能:https://developer.apple.com/reference/spritekit/skemitternode/1398027-advancesimulationtime
    2. 这意味着当SKEmittors进入屏幕时,您可以通过太空准备好星星显示船驶向何处。建立星星不需要加载延迟,这是立即做到的。

      尽可能接近我的想象,你需要一个3粒子发射器来拉断它,每个都是设备屏幕的大小。将粒子爆裂出来,然后将你想要视差的每一层释放到相机右侧“深度”的目标节点,然后根据屏幕移动移动这些目标。

      有点凌乱,但可能比创建自己的系统更快,更容易,更有力地充满了有趣的效果。

      也许......我错了。

答案 1 :(得分:1)

编辑:代码很干净,现在正在运行。我为此设置了一个GitHub回购。

我想我没有解释我想要的东西。我需要一个跟随相机的星空背景,就像你在Subspace中找到的那样(在日子里回来)

结果很酷且令人信服!稍后当节点数量成为瓶颈时,我可能会回到这里。我仍然相信这样做的正确方法是使用着色器!

这是我在GitHub上的代码的链接。我希望它对某人有用。它仍在进行中,但效果很好。回购中包含来自 SKTUtils (Ray Wenderlich的库,已经在github上免费提供)的源代码,以及我自己的扩展名为Ray的工具,我称之为 nuts-n-bolts < / em>的。这些只是每个人都应该发现有用的常见类型的扩展。当然,您拥有 StarfieldNode InteractiveCameraNode 的源以及一个小型演示项目。

Starfield in action in my project