2015-07-18 23 views
10

Właśnie zainstalowałem open beta iOS 9 (wersja 3), a teraz mam mnóstwo problemów z shaderów SpriteKit. IOS 8 następujący kod pracował dobrze:Awaria shadera SpriteKit iOS 9: SKDefaultShading, gl_FragCoord

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

Edycja: plik „TheShader.fsh” wygląda następująco:

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; 

na iOS 9 konsola jest wypluwają stos ostrzeżenia w ten 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 
      ^
} 

Wygląda iOS9 nie wspiera SKDefaultShading i gl_FragCoord. Jak znaleźć lokalny wymiar pikseli bez użycia gl_FragCoord?

Konsola kontynuuje powtarzanie tego na zawsze, spowalniając działanie urządzenia. Oto zrzut ekranu: enter image description here

Jeśli skomentuję powyższe wiersze, które mówią "tutaj problemy z kompatybilnością iOS9", problem sam się rozwiązuje, ale nie mam żadnych shaderów.

Ktoś jeszcze ma ten problem? Znaczna pomoc byłaby doceniona.

+0

Jest to więcej niż prawdopodobne, błąd po ich stronie.Aktualizowałem niektóre rzeczy dzisiaj i również natknąłem się na te problemy. – Tony

+0

Czy to wymyśliłeś? Uruchamianie tego samego wydania w Xcode 7.0 i iOS 9.1 public beta 1. – CloakedEddy

+0

Jeszcze nie, jeśli to możliwe, zgłoś zgłoszenie błędu. Im więcej raportów, tym szybciej mogą to naprawić! – user2821647

Odpowiedz

2

Mój niestandardowy program SKShader również przestał działać w ios9 na urządzeniach metalowych.

udało mi się go naprawić za pomocą v_tex_coord aby uzyskać pozycję piksela oraz niestandardowy mundur do wysłania w rozmiarze sprite (Wydaje się, że błąd, który u_sprite_size nie jest przekazywany w.)

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

Czy możesz dodać więcej informacji i kodu, jak zastąpić/obliczyć gl_FragCoord na podstawie tego, co wspomniałeś w zaakceptowanej odpowiedzi. Wielkie dzięki! – nzs

+0

To nie rozwiązuje problemów dla mnie. Wydaje się, że SKDefaultShading() zniknął. – Jonny

+0

BTW Myślę, że 'u_sprite_size' jest przestarzałe. – Jonny

6

Przyjechałem tu po obejrzeniu wiadomości użycie identyfikatora nierejestrowanej „gl_FragCoord” ale ostatecznie mogę rozwiązać mój problem, zastępując

gl_FragCoord.xy/u_sprite_size.xy

z

v_tex_coord

+0

OK, pomogło mi to z podobnym problemem. Wydawało się, że 'gl_FragCoord' również jest złe. – Jonny

1

miałem ten problem też z iOS9. gl_FragCoord przestał działać na prawdziwych urządzeniach, ale działa w symulatorze systemu iOS.

Obejść.

Tworzenie węzła z Shader

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

zaktualizować jednolity

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 
2

spróbuj dodać parametr 'PrefersOpenGL' typu boolean ustawione na 'TAK' w info.plist. Spowoduje to wyłączenie Metal