为什么 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;
}
}
}
}
我在我的项目中添加了两个着色器,一个与 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;
}
}
}
}