Xcode 7 / iOS 9:在 SKNode 中使用 OpenGL 片段着色器未编译
Posted
技术标签:
【中文标题】Xcode 7 / iOS 9:在 SKNode 中使用 OpenGL 片段着色器未编译【英文标题】:Xcode 7 / iOS 9: Using OpenGL fragment shader in SKNode is not compiling 【发布时间】:2015-10-31 11:12:32 【问题描述】:我使用SKScene
和SKNode
创建了一个Swift 项目来显示片段着色器的结果。该项目是使用 ios 8.x 和 Xcode 6.x 创建的。
由于我升级到使用 Xcode 7 和 iOS 9(目前是 7.1 和 iOS 9.1),着色器不再在运行时编译并显示各种问题,例如:
program_source:16:7: warning: no previous prototype for function 'simpleRand'
float simpleRand(vec2 n)
^
program_source:26:31: error: use of undeclared identifier 'PI'
float rad = val.x * 2.0 * PI * u_frequency[0];
^
program_source:26:36: error: use of undeclared identifier 'u_frequency'
float rad = val.x * 2.0 * PI * u_frequency[0];
据我所知,似乎从 iOS 9 / Xcode 7 开始,使用的默认片段着色器语言是 Metal 而不是 OpenGL,所以我的猜测是,编译器会尝试编译 Metal 代码。 如果是这种情况,我可以如何以及在哪里指定我想要 OpenGL ES?
着色器被初始化为:
func setupShader(uniforms: Array<SKUniform>)
if let shader = self.noiseShader
shader.uniforms = uniforms
self.shaderContainer = SKSpriteNode(color: UIColor.redColor(), size: self.size)
if let shaderContainer = self.shaderContainer
self.addChild(shaderContainer)
shaderContainer.position = CGPointMake(self.size.width/2.0, self.size.height/2.0)
shaderContainer.shader = shader;
并且此代码在 Xcode 7 / iOS 9 之前完美运行。
这是我正在使用的一些着色器代码:
const float PI = 3.14159265;
float sinNoise(vec2 val)
float rad = val.x * 2.0 * PI * u_frequency;
return sin(rad);
///////////////////////////////////////
// Main
///////////////////////////////////////
void main()
vec2 position = v_tex_coord; // gets the location of the current pixel in the intervals [0..1] [0..1]
float vnoise = sinNoise(position) / 2.0;
float color = vec4(vec3(vnoise + 0.5), 1.0);
gl_FragColor = color;
重要信息:该代码在模拟器中运行良好(例如,对于带有 iOS 9.1 的 iPad Air 2),但不能在具有该操作系统的同一物理设备上运行时编译。
【问题讨论】:
你能发布你正在使用的着色器代码吗? 【参考方案1】:好的,我在另一篇文章中找到了答案。 您可以在项目的 info.plist 文件中添加一个条目:
首选OpenGL (BOOL) YES
如对这篇文章的回答所示: xcode error calling display has no effect
这行得通,但闻起来不是很好。猜猜这是一个临时解决方案,它会在某个时间点中断。
【讨论】:
以上是关于Xcode 7 / iOS 9:在 SKNode 中使用 OpenGL 片段着色器未编译的主要内容,如果未能解决你的问题,请参考以下文章
iOS 7 SpriteKit 游戏 - 保存加载游戏时出错:'尝试将 nil 节点添加到父节点:<SKNode> 名称:'(null)'
IOS 9.2 Xcode 7.2 Facebook 登录问题
Xcode 7:iOS 9 模拟器上没有 launchImage