Crash de shader SpriteKit iOS 9: SKDefaultShading, gl_FragCoord

Juste installé l'iOS 9 beta ouverte (version 3) et maintenant j'ai beaucoup de problèmes avec les shaders SpriteKit. Sur iOS 8, le code suivant a bien fonctionné:

_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]; 

Edit: le file "TheShader.fsh" ressemble à ceci:

 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; 

Sur iOS 9, la console crache une stack d'avertissements dans ce format:

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

On dirait que iOS9 ne supporte pas SKDefaultShading et gl_FragCoord. Comment find la dimension de pixel locale sans utiliser gl_FragCoord?

La console continue à répéter ceci pour toujours, ralentissant l'appareil. Voici une capture d'écran: entrez la description de l'image ici

Si je commente les lignes ci-dessus qui disent "problèmes de compatibilité iOS9 ici" alors le problème se résout, mais alors je n'ai pas de shaders.

Quelqu'un d'autre a-t-il ce problème? Beaucoup d'aide serait appréciée.

Mon SKShader personnalisé a également cessé de fonctionner dans ios9 sur des appareils en métal.

J'ai été capable de le réparer en utilisant v_tex_coord pour get la position du pixel, et un uniforme personnalisé pour envoyer la taille du sprite (Il semble y avoir un bug où u_sprite_size n'est pas transmis.)

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

Je suis venu ici après avoir vu le message d' utilisation de l'identifiant non déclaré 'gl_FragCoord' mais finalement j'ai pu résoudre mon problème en remplaçant

gl_FragCoord.xy / u_sprite_size.xy

avec

v_tex_coord

Essayez d'append le paramètre 'PrefersOpenGL' de type boolean à 'YES' dans info.plist. Cela désactivera le métal

J'ai aussi eu ce problème avec iOS9. gl_FragCoord cessé de fonctionner sur de vrais appareils, mais fonctionne dans le simulateur iOS.

Solution de contournement.

Créer un noeud avec shader

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

Mettre à jour l'uniforme

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

Shader

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