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

时间:2015-07-02 22:54:42

标签: sprite-kit shader

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

enter image description here

自定义制服的着色器位于下方,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是一个项目,我只用着色器和两个精灵来展示问题。

2 个答案:

答案 0 :(得分:1)

据我所知,您的代码没有任何问题。似乎有一个错误,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;

答案 1 :(得分:0)

didMoveToView:中添加类似下面代码的内容就可以了,不知何故,制服在那里,但着色器无法读取,而且#34;刷新"这些价值确实使它正常运作。

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;
            }
        }
    }
}