我使用SKScene
和SKNode
創建了一個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),但不會在具有該操作系統的同一物理設備上運行時編譯。
你可以發佈你使用的着色器代碼嗎? – icant