/ / SwiftでC const変数をUnsafePointerとして使用-ios、c、swift、opengl-es

SwiftのCのconst変数をUnsafePointerとして使用する - ios、c、swift、opengl-es

次のような.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に入ることがわかります。代わりにポインタ変数を使用すると、問題が修正されます。

  1. C: const float positions[9]; 翻訳する
    let positions: (Float, Float, Float, Float, Float, Float, Float, Float, Float) スイフトで

  2. 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でタプルとして配列を持つことは非常に奇妙に思えますが、誰かがこれについて考えている場合は、フィードバックをいただければ幸いです。