2016-10-26 13 views
3

バッファと頂点での作業Iバッファにいくつかの頂点データ(属性)をロードする Swift 3でglVertexAttribPointer関数を使用するには?

glBufferData(GL_ARRAY_BUFFER, sizeof(attributes), attributes, GL_DYNAMIC_DRAW); 

を使用するのOpenGL ES(3.0)とObjective-Cの属性、次いで

glEnableVertexAttribArray(0); 
glVertexAttribPointer(0, sizeof(VertexCoordinatesStruct)/sizeof(GLfloat), GL_FLOAT, GL_FALSE, sizeof(VertexAttributesStruct), 0); 

glEnableVertexAttribArray(1); 
glVertexAttribPointer(1, sizeof(TextureCoordinatesStruct)/sizeof(GLfloat), GL_FLOAT, GL_FALSE, sizeof(VertexAttributesStruct), (void *)sizeof(VertexCoordinatesStruct)); 

に頂点シェーダ用のバッファに頂点データメモリレイアウトを指定します。どのようにしてsizeof(OGLVertexCoordinates)をvoid *に2番目のglVertexAttribPointer呼び出しでキャストしているかに注目してください。これは、TextureCoordinatesStructデータが存在するGL_ARRAY_BUFFERのオフセットです。

そして私はSwift 3で同じ正確なタイプのコードを実装しようとしていますが、glVertexAttribPointer関数はUnsafeRawPointerをvoid *でなく最後のパラメータとして取ります。 私はObjcでできるように、特定の値(メモリオフセット)でUnsafeRawPointerを作成できません。

スウィフトでは動作しません。単に、私は、すべてのQは/ AIは見つけることができる研究してきたが、それらのすべてが、私の場合には適していませんか

答えて

6

3.あなたがののOpenGL ESゲームテンプレートを確認しましたXcode?

(Xcodeの8.1 GM種子でテスト済み。)

をGameViewController.swiftで、あなたはこの見つけることができます:

glEnableVertexAttribArray(GLuint(GLKVertexAttrib.position.rawValue)) 
    glVertexAttribPointer(GLuint(GLKVertexAttrib.position.rawValue), 3, GLenum(GL_FLOAT), GLboolean(GL_FALSE), 24, BUFFER_OFFSET(0)) 
    glEnableVertexAttribArray(GLuint(GLKVertexAttrib.normal.rawValue)) 
    glVertexAttribPointer(GLuint(GLKVertexAttrib.normal.rawValue), 3, GLenum(GL_FLOAT), GLboolean(GL_FALSE), 24, BUFFER_OFFSET(12)) 

BUFFER_OFFSET(_:)を(Objective-Cのテンプレートで、それはマクロだが)のように定義されます:

func BUFFER_OFFSET(_ i: Int) -> UnsafeRawPointer { 
    return UnsafeRawPointer(bitPattern: i)! 
} 

残念ながら、これはバグであり、ランタイムがクラッシュします。あなたはいくつかの特定の値でUnsafeRawPointerを作成することができ、このBUFFER_OFFSET(_:)

func BUFFER_OFFSET(_ i: Int) -> UnsafeRawPointer? { 
    return UnsafeRawPointer(bitPattern: i) 
} 

:あなたはそれを修正する必要があります。

+0

これだけです! UnsafeRawPointer(bitPattern:i)は私が必要とするものです。ありがとうございました!私は実際にその初期化子を見たが、なぜパラメータがbitPatternと呼ばれるのか分からなかったので、私はそれを見落とした:(後でそれらのランタイムクラッシュをチェックするだろう)私が見つけたら/問題を解決するならここで報告するだろう –

+0

クラッシュやその他の問題が発生します。 –

1

けれどもは

let ptr = UnsafePointer<UInt8>(bitPattern: UInt(offsetInBytes)) 
glVertexAttribPointer(indx, size, type, GLboolean(GL_FALSE), stride, ptr) 

ptr ...私はこの方法でやって、とにかく、本当に正しい感じていないoffsetInBytes == 0場合nilは値0とポインタの表現であるため、nilなり(= NULLポインタ) ... IMO。

関連する問題