SpriteKit 着色器崩溃 iOS 9:SKDefaultShading,gl_FragCoord
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 的情况下找到局部像素尺寸?
控制台会一直重复此操作,从而降低设备速度。这是一个截图:
如果我注释掉上面说 "iOS9 compatibility issues here" 的行,那么问题就会自行解决,但是我没有任何着色器。
还有其他人有这个问题吗?将不胜感激。
我的自定义 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'
但最终我可以通过替换
来解决我的问题
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 中添加布尔类型设置为 'YES' 的参数 'PrefersOpenGL'。这将禁用 Metal
刚刚安装了 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 compatibility issues here" 的行,那么问题就会自行解决,但是我没有任何着色器。
还有其他人有这个问题吗?将不胜感激。
我的自定义 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' 但最终我可以通过替换
来解决我的问题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 中添加布尔类型设置为 'YES' 的参数 'PrefersOpenGL'。这将禁用 Metal