SpriteKit shader crash 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?
Консоль продолжает повторять это навсегда, замедляя работу устройства. Вот скриншот:
![enter image description here]()
Если я прокомментирую вышеприведенные строки, которые говорят "проблемы совместимости с iOS9 здесь", тогда проблема решает сам, но тогда у меня нет шейдеров.
У кого-нибудь еще эта проблема? Значительная помощь будет оценена.
Ответы
Ответ 1
Мой пользовательский SKShader также прекратил работу в ios9 на металлических устройствах.
Мне удалось исправить это, используя v_tex_coord, чтобы получить положение пикселя, и пользовательскую униформу для отправки в размере спрайта (Кажется, что ошибка, в которой не передается u_sprite_size.)
[SKUniform uniformWithName:@"u_fixed_size" floatVector2:GLKVector2Make(n.calculateAccumulatedFrame.size.width, n.calculateAccumulatedFrame.size.height)]
Ответ 2
Я пришел сюда после просмотра сообщения использования необъявленного идентификатора gl_FragCoord
но в итоге я смог решить свою проблему, заменив
gl_FragCoord.xy/u_sprite_size.xy
с
v_tex_coord
Ответ 3
Попробуйте добавить параметр 'PrefersOpenGL' типа boolean в значение 'YES' в info.plist. Это отключит Metal
Ответ 4
У меня тоже была проблема с iOS9. gl_FragCoord
перестает работать на реальных устройствах, но работает в симуляторе iOS.
Работать вокруг.
Создайте node с шейдером
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