为什么 SpriteKit 不更新着色器的制服?

Why is SpriteKit not updating the shader’s uniforms?

我在我的项目中添加了两个着色器,一个与 WWDC 2014 示例中的着色器相同,另一个具有相同的代码但添加了自定义制服。问题在于,当应用程序为 运行 时,具有自定义制服的精灵呈现为静态,而在 Xcode 中的 SpriteKit 编辑器中呈现为黑色。

带有自定义制服的着色器如下,u_speed用于控制波浪移动的速度。

void main()
{
    float currTime = u_time * u_speed;

    vec2 uv = v_tex_coord;
    vec2 circleCenter = vec2(0.5, 0.5);
    vec3 circleColor = vec3(0.8, 0.5, 0.7);
    vec3 posColor = vec3(uv, 0.5 + 0.5 * sin(currTime)) * circleColor;

    float illu = pow(1. - distance(uv, circleCenter), 4.) * 1.2;
    illu *= (2. + abs(0.4 + cos(currTime * -20. + 50. * distance(uv, circleCenter)) / 1.5));

    gl_FragColor = vec4(posColor * illu * 2., illu * 2.) * v_color_mix.a;
}

This 是我将着色器和两个显示问题的精灵放在一起的项目。

据我所知,您的代码没有任何问题。 GameScene.sks 如何将您的自定义着色器制服传递到着色器中似乎存在错误,导致它为 0,并且动画冻结。

如果您在代码中而不是在 UI Builder 中初始化所有内容,它工作正常。将此粘贴到您的 didMoveToView: 中以了解我的意思。

SKSpriteNode *sprite = [SKSpriteNode spriteNodeWithColor:[SKColor whiteColor] size:CGSizeMake(100, 100)];
sprite.position = CGPointMake(self.size.width/2, self.size.height/2);
[self addChild:sprite];
SKShader* spin2x = [SKShader shaderWithFileNamed:@"Shader2"];

spin2x.uniforms = @[
                         [SKUniform uniformWithName:@"u_speed" float:(2.0)],
                         ];
sprite.shader = spin2x;

didMoveToView: 中添加类似于下面代码的东西就成功了,不知何故制服在那里但着色器没有读取,这个 "refreshing" 的值确实使它正常工作。

for (SKSpriteNode *sprite in self.children) {
    if ([sprite isKindOfClass:[SKSpriteNode class]]) {
        for (SKUniform *uniform in sprite.shader.uniforms) {
            if (uniform.uniformType == SKUniformTypeFloat) {
                uniform.floatValue = uniform.floatValue;
            }
        }
    }
}