次のような.h / cファイルに単純なC const変数があります。
data.h
const float positions[9];
data.c
#include "data.h"
const float positions[9] = {
1.0, -1.0, 1.0,
-1.0, -1.0, 1.0,
-1.0, -1.0, -1.0,
};
迅速
この変数のデータをSwiftでどのように使用できますか?より具体的には、データを渡す必要があります glVertexAttribPointer(,,,,, <#ptr: UnsafePointer<Void>#>)
.
たとえば、私はスウィフトに次のコードを持っています:(追加しました data.h ブリッジングヘッダーへ):
glEnableVertexAttribArray(0)
glVertexAttribPointer(0, 3, GLenum(GL_FLOAT), GLboolean(GL_FALSE), 0, positions)
// Error: "(Float, Float, Float, Float, Float, Float, Float, Float, Float)" is not convertible to "UnsafePointer<Void>"
glDrawArrays(GLenum(GL_TRIANGLES), 0, 3)
私が得るエラーは 「(フロート、フロート、フロート、フロート、フロート、フロート、フロート、フロート、フロート)」は「UnsafePointer <Void>」に変換できません.
これは単なるテストアプリであるため、VBOを使用していません(リスト8-2)。
回答:
回答№1の場合は3静的に割り当てられたC配列がタプルとしてSwiftに入ることがわかります。代わりにポインタ変数を使用すると、問題が修正されます。
C:
const float positions[9];
翻訳する
let positions: (Float, Float, Float, Float, Float, Float, Float, Float, Float)
スイフトでC:
const float *positions;
翻訳する
var positions: UnsafePointer<Float>
スイフトで (これが必要です)
したがって、Cファイルを次のように変更すると、トリックが実行されます。
data.h
const float *positions;
data.c
#include "data.h"
const float _positions[9] = {
1.0, -1.0, 1.0,
-1.0, -1.0, 1.0,
-1.0, -1.0, -1.0,
};
const float *positions = _positions;
迅速
glVertexAttribPointer(0, 3, GLenum(GL_FLOAT), GLboolean(GL_FALSE), 0, positions)
Swiftでタプルとして配列を持つことは非常に奇妙に思えますが、誰かがこれについて考えている場合は、フィードバックをいただければ幸いです。