2015-10-31 46 views
2

我使用SKSceneSKNode創建了一個Swift項目,以顯示片段着色器的結果。該項目使用iOS 8.x和Xcode 6.x創建。 自從我升級到使用Xcode中7和iOS 9(目前爲7.1和iOS 9.1),着色器在運行時也不再編譯並顯示所有類型的問題,如:Xcode 7/iOS 9:在SKNode中使用OpenGL片段着色器不編譯

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/9的iOS

下面是一些我使用的着色器代碼:

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; 
} 

重要信息:該代碼在模擬器中完美工作(例如,iPad Air 2與iOS 9.1),但不會在具有該操作系統的同一物理設備上運行時編譯。

+0

你可以發佈你使用的着色器代碼嗎? – icant

回答

0

好吧,我在另一篇文章中找到了答案。 您可以將條目添加到您的項目Info.plist文件:

PrefersOpenGL(BOOL)是如圖回答這個職位

xcode error calling display has no effect

這工作,但它聞起來不是很好。猜測這是一個臨時解決方案,它會在某個時間點中斷。