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 【问题描述】:

我使用SKSceneSKNode 创建了一个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 登录问题

设备不会运行错误 iOS 9 Xcode 7.0

Xcode 7:iOS 9 模拟器上没有 launchImage

iOS 9 Xcode 7 - 应用程序在顶部和底部出现黑条

iOS 9 Xcode 7 - 应用程序在顶部和底部出现黑条