我正在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秒左右发生的事情:
着色器代码如下:
#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);
}