我在我的项目中添加了两个着色器,一个是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是一个项目,我只用着色器和两个精灵来展示问题。
答案 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;
}
}
}
}