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

SpriteKit着色器崩溃iOS 9:SKDefaultShading,gl_FragCoord,ios,iphone,ipad,sprite-kit,ios9,Ios,Iphone,Ipad,Sprite Kit,Ios9,刚刚安装了iOS9公测版(版本3),现在我在SpriteKit着色器方面遇到了很多问题。在iOS 8上,以下代码运行良好: _fontShader = [SKShader shaderWithFileNamed:@"TheShader"]; // TODO: iOS9 compatibility issues here _fontUniform = [SKUniform uniformWithName:@"labelBase" float:0]; [self.fontShader addUnif

刚刚安装了iOS9公测版(版本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来获得像素位置,并使用定制制服来发送精灵大小(似乎有一个bug没有传入精灵大小)


我是在看到消息使用未声明的标识符“gl_FragCoord”后来到这里的。 但最终我可以通过替换来解决我的问题

gl_FragCoord.xy/u_sprite_size.xy

v_tex_coord


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

解决问题

使用着色器创建节点

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

尝试在info.plist中将布尔类型的参数“PrefersOpenGL”添加到“YES”。这将禁用金属

这很可能是他们这边的一个bug。我今天更新了一些东西,也遇到了这些问题。你发现了吗?在Xcode 7.0和iOS 9.1公共beta 1上遇到同样的问题。还没有,如果可以的话,请提交错误报告。报告越多,他们修复的速度就越快!苹果什么时候会关注SpriteKit,我的游戏都在iOS9中被破坏了,我收到了不好的评论,这不是我的错。这太可怕了。有人知道雷达号了吗?SDK文档没有提到任何关于SKD被弃用或任何事情。我提交了一个bug,并在文档页面上给出了反馈,看看他们是否更新了它,你能添加更多信息和代码吗,如何根据你在接受的答案中提到的内容替换/计算总账。非常感谢!这并不能解决我的问题。SKDefaultShading()似乎不存在了。顺便说一句,我认为
u\u sprite\u size
已被弃用。好的,这帮助我解决了类似的问题。似乎格拉格库尔德也很糟糕。
vec2 xy = v_tex_coord * u_spriteSize - u_polkaCenter; // new code
//vec2 xy = gl_FragCoord.xy - u_polkaCenter;  // old code that worked before iOS9