SKTransition完成后SpriteKit SKShader翻转

时间:2018-05-30 11:02:18

标签: ios swift sprite-kit skspritenode fragment-shader

我正在SpriteKit中创建一个以空间为主题的游戏并模拟一个星空我正在使用ShaderToy的GLSL片段着色器,转换为在SpriteKit中工作。

要使用它,我只需初始化一个与我的场景(2048 x 1536)大小相同的清晰SKSpriteNode,并将着色器应用于此节点。

let starField = SKSpriteNode(color: UIColor.clear, size: CGSize(width: 2048, height: 1536))
let shader = SKShader(fileNamed: "Starfield.fsh")
starField.shader = shader

着色器渲染得很好并显示出一个漂亮的星空。到目前为止,非常好。

当我使用SKTransition从不同的场景转换时,会出现问题。在过渡期间,着色器似乎是光栅化的,一旦过渡完成,整个过程就会颠倒过来。

我的转换代码(似乎与我使用的转换或持续时间无关):

let gameScene = GameScene(level: level)
gameScene.scaleMode = self.scaleMode
let transition = SKTransition.fade(withDuration: 3.0)
transition.pausesIncomingScene = true
self.view?.presentScene(gameScene, transition:transition)

我尝试过使用不同的着色器,同样的情况发生了 - 在过渡期间,星空是一个向上的方向,并且在前一个场景被清除后立即“翻转”。有没有人经历过同样的事情并知道发生了什么?

我有一个问题的视频,你可以看到在7秒左右发生的事情:

https://youtu.be/l1lLv6MwKYU

着色器代码如下:

#define M_PI 3.1415926535897932384626433832795

float rand(vec2 co);

float rand(vec2 co)
{
    return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);
}

void main()
{
    float size = 50.0;
    float prob = 0.95;

    vec2 pos = floor(1.0 / size * gl_FragCoord.xy);

    float color = 0.0;
    float starValue = rand(pos);

    if (starValue > prob)
    {
        vec2 center = size * pos + vec2(size, size) * 0.5;

        float t = 0.9 + 0.2 * sin(u_time + (starValue - prob) / (1.0 - prob) * 45.0);

        color = 1.0 - distance(gl_FragCoord.xy, center) / (0.9 * size);
        color = color * t / (abs(gl_FragCoord.y - center.y)) * t / (abs(gl_FragCoord.x - center.x));
}
    else if (rand(v_tex_coord) > 0.996)
    {
        float r = rand(gl_FragCoord.xy);
        color = r * (0.25 * sin(u_time * (r * 5.0) + 720.0 * r) + 0.75);
    }

        gl_FragColor = vec4(vec3(color), 1.0);
    }

0 个答案:

没有答案