2015-09-17 68 views
4

我無法在iOS版9節點的幾何着色器運行我的程序下面是測試代碼:幾何程序在iPad迷你不起作用2的iOS 9

import SceneKit 

class Test: NSObject, SCNProgramDelegate { 

    private static let SIZE = 10 

    private static let RES = 256 

    var node: SCNNode! 

    override init() { 
     super.init() 

     setup() 
    } 

    func program(program: SCNProgram, handleError error: NSError) { 
     NSLog("program error: %@", error) 
    } 

    private func setup() { 
     node = SCNNode() 
     node.rotation = SCNVector4Make(1, 0, 0, -Float(M_PI)/2) 

     node.geometry = createGeometry() 
    } 

    private func createGeometry() -> SCNGeometry { 
     let size = CGFloat(GpuHeightFieldWater.SIZE) 
     let geometry = SCNPlane(width: size, height: size) 
     geometry.widthSegmentCount = GpuHeightFieldWater.RES 
     geometry.heightSegmentCount = GpuHeightFieldWater.RES 

     let program = SCNProgram() 
     program.delegate = self 
     program.vertexShader = loadShader("test.vsh") 
     program.fragmentShader = loadShader("test.fsh") 

     program.setSemantic(SCNGeometrySourceSemanticVertex, forSymbol: "a_position", options: nil) 
     program.setSemantic(SCNModelViewProjectionTransform, forSymbol: "u_mvpMatrix", options: nil) 

     geometry.program = program 

     return geometry 
    } 

    private func loadShader(name: String) -> String! { 
     let file = NSString(string: name) 
     let url = NSBundle.mainBundle().URLForResource(file.stringByDeletingPathExtension, withExtension: file.pathExtension) 
     let data = NSData(contentsOfURL: url!) 
     return String(data: data!, encoding: NSUTF8StringEncoding) 
    } 
} 

test.vsh:

attribute vec4 a_position; 
uniform mat4 u_mvpMatrix; 

void main() 
{ 
    vec4 a = a_position; 
    a.x = 0; 

    gl_Position = u_mvpMatrix * a; 
} 

test.fsh:

void main() 
{ 
    gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0); 
} 

節點添加到場景的根節點,我看到飛機(用異樣的紫色),但我從來沒有程序運行和我做沒有看到我的程序有任何錯誤。所以它看起來像我的程序被忽略。

什麼是錯的,以及如何運行程序的幾何權利?

更新#1

當我運行在iPhone 5S的應用程序模擬器它在7行

ERROR: 0:7: Incompatible types (float and int) in assignment (and no available implicit conversion)

印刷錯誤我的頂點着色器代碼時,我解決這個錯誤,它的工作原理。奇怪的是,當我在iPad Mini 2(iOS 9.0)上運行這個應用程序時,我沒有看到任何錯誤。

更新#2

爲了避免誤解,我改變問題的標題,因爲我發現,在iPhone 5S模擬器它顯示了程序錯誤。所以問題是有關iPad的迷你2與iOS 9

而且我發現我的設備上顯示金屬(百萬噸):

enter image description here

,並在iPhone模擬器它顯示GL:

enter image description here

也許它與某個問題有關。

+0

你得到什麼錯誤? –

回答

3

問題出在Rendering API參數爲SCNView視圖。當您從Game模板創建項目時,它具有Default呈現API。

看起來像默認意味着Metal這就是爲什麼我的程序幾何被忽略的原因。當我將渲染API更改爲Open GL ES時,它開始在着色器中使用我的程序。

當我在模擬器中運行我的應用程序時,它使用OpenGL ES作爲默認渲染API。我不知道它爲什麼會這樣工作,因爲它讓開發人員感到困惑。枚舉只有兩個值:

enum SCNRenderingAPI : UInt { 
    case Metal 
    case OpenGLES2 
} 

沒有任何Default價值,以及如何開發者將猜測的iOS選擇渲染API?我對這部分文檔不滿意。

+0

是的,同意了。我認爲這是問題的一個重要組成部分,這些問題源於Storyboard和三大遊戲引擎GUI,都是Scene Editor和Particle Editor的靈感來源。而他們是不完整的和無證的。在代碼中完成代碼和呈現在文檔中的方式與確定您的狀態的可視化編輯器中的代碼和選項之間存在的差異略有不同。而且,在iPad mini 2上,OpenGL和Metal不會以相同的方式呈現。嘗試使用添加劑混合模式以及幾個圖層來查看區別。 – Confused

+0

只花了我3個小時的谷歌搜索找到這個答案... – CloakedEddy

0

嘗試改用7號線:

a.x = 0; 

a.x = 0.0; 

錯誤實際上是在暗示該行(0:7)和問題,因爲你給一個int其中float預期。

+0

我知道如何解決錯誤(請參閱更新#1)。我的問題是關於爲什麼在iOS 9中不打印任何錯誤。 –

+0

有趣。是否有其他類型的日誌/錯誤顯示?對此感到抱歉。 – Moustach

+0

不,它在我使用iOS 9的真實設備上運行時不會打印任何內容。 –

相關問題