Xcode 7/iOS 9:在SKNode中使用OpenGL片段着色器未编译

Xcode 7/iOS 9:在SKNode中使用OpenGL片段着色器未编译,ios,xcode,opengl-es,sprite-kit,Ios,Xcode,Opengl Es,Sprite Kit,我使用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) ^ pro

我使用
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;
        }
    }
}

重要信息:该代码在模拟器中运行良好(例如,iPadAir 2和iOS9.1),但不会在与该操作系统相同的物理设备上运行编译。

好的,我在另一篇文章中找到了答案。 您可以向projects info.plist文件添加条目:

首选英语(BOOL)是的

如对本帖的回答所示:


这管用,但味道不太好。我猜这是一个临时解决方案,它将在某个时间点中断。

您可以发布您正在使用的着色器代码吗?
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;
}