SpriteKit着色器崩溃iOS 9:SKDefaultShading,gl_FragCoord

刚刚安装了iOS 9的公测(版本3),现在我遇到了很多SpriteKit着色器的问题。 在iOS 8下面的代码工作得很好:

_fontShader = [SKShader shaderWithFileNamed:@"TheShader"]; // TODO: iOS9 compatibility issues here _fontUniform = [SKUniform uniformWithName:@"labelBase" float:0]; [self.fontShader addUniform:self.fontUniform]; // TODO: iOS9 compatibility issues here _fontEffects = [SKEffectNode node]; self.fontEffects.shader = self.fontShader; // TODO: iOS9 compatibility issues here self.fontEffects.shouldEnableEffects = YES; self.fontEffects.shouldCenterFilter = NO; self.fontEffects.shouldRasterize = YES; [self addChild:self.fontEffects]; 

编辑:文件“TheShader.fsh”看起来像这样:

 float yPos = gl_FragCoord.y - labelBase; // iOS 9 Compatibility issues here float gradient = 0.35*(yPos / u_sprite_size.y); // ranges from 0 at base to 0.35 at top vec4 color = SKDefaultShading(); // the current label color (iOS 9 Compatibility issues here) color = vec4(gradient + color.r, gradient + color.g, gradient + color.b, color.a); color.rgb *= color.a; // set background to alpha 0 gl_FragColor = color; 

在iOS 9上,控制台以这种格式喷出一堆警告:

 2015-07-12 22:43:17.717 ReconInForce[599:110531] Jet: Error Domain=MTLLibraryErrorDomain Code=3 "Compilation failed: program_source:8:18: error: use of undeclared identifier 'gl_FragCoord' float yPos = gl_FragCoord.y - labelBase[0]; ^ program_source:11:18: error: use of undeclared identifier 'SKDefaultShading' vec4 color = SKDefaultShading(); // the current label color ^ " UserInfo=0x158c084b0 {NSLocalizedDescription=Compilation failed: program_source:8:18: error: use of undeclared identifier 'gl_FragCoord' float yPos = gl_FragCoord.y - labelBase[0]; ^ program_source:11:18: error: use of undeclared identifier 'SKDefaultShading' vec4 color = SKDefaultShading(); // the current label color ^ } 

好像iOS9不支持SKDefaultShading和gl_FragCoord。 如何在不使用gl_FragCoord的情况下查找本地像素维度?

控制台会一直重复这个操作,减慢设备速度。 这里有一个截图: 在这里输入图像说明

如果我注释掉上面提到的“iOS9兼容性问题”这一行,那么问题就解决了,但是我没有任何着色器。

还有谁有相同的问题吗? 将不胜感激。

我的自定义SKShader也停止在金属设备上的ios9工作。

我能够使用v_tex_coord来修复它的像素位置,并自定义统一发送精灵大小(似乎有一个错误,其中u_sprite_size没有被传入)。

 [SKUniform uniformWithName:@"u_fixed_size" floatVector2:GLKVector2Make(n.calculateAccumulatedFrame.size.width, n.calculateAccumulatedFrame.size.height)] 

看到消息使用未声明的标识符“gl_FragCoord”后,我来到这里,但最终我可以通过replace

gl_FragCoord.xy / u_sprite_size.xy

v_tex_coord

尝试在info.plist中添加booleantypes参数“PrefersOpenGL”设置为“YES”。 这将禁用金属

我也有iOS9这个问题。 gl_FragCoord停止在真实设备上工作,但在iOS模拟器中工作。

解决办法

使用着色器创build一个节点

 let shader = SKShader(fileNamed: "polka.fsh") let uniform = SKUniform(name: "u_spriteSize", floatVector2: GLKVector2Make(Float(200), Float(200))) shader.uniforms.append(uniform) 

更新制服

 if let uniform = shader.uniformNamed("u_spriteSize") { let size = frame.size uniform.floatVector2Value = GLKVector2Make(Float(size.width * screenScale), Float(size.height * screenScale)) } 

着色器

 vec2 xy = v_tex_coord * u_spriteSize - u_polkaCenter; // new code //vec2 xy = gl_FragCoord.xy - u_polkaCenter; // old code that worked before iOS9