0

OpenGL ES アプリに次の Vertex 構造体があります。

typedef struct Vertex {
float Position[3];
float Color[4];
} Vertex;

次に、ヘッダーで次のように宣言します。

Vertex *Vertices;

次に、私のinitメソッドで:

 int array = 4;
 Vertices = (Vertex *)malloc(array * sizeof(Vertex));

その後、メッシュを次のように設定します。この場合、頂点配列には 4 つの頂点があります。

- (void)setupMesh {
int count = 0;

for (VerticeObject * object in verticesArray) {

    Vertices[count].Position[0] = object.x;
    Vertices[count].Position[1] = object.y;
    Vertices[count].Position[2] = object.z;

    Vertices[count].Color[0] = 0.9f;
    Vertices[count].Color[1] = 0.9f;
    Vertices[count].Color[2] = 0.9f;
    Vertices[count].Color[3] = 1.0f;

    count ++;
    }
 }

ここで私が間違っていることを誰でも見つけることができますか? この Vertices オブジェクトを OpenGL に渡すと何も描画されませんが、Vertices 配列を次のようにハードコーディングすると:

Vertex Vertices [] = {
{{0.0, 0.0, 0}, {0.9, 0.9, 0.9, 1}},
{{0.0 , 0.0 , 0}, {0.9, 0.9, 0.9, 1}},
{{0.0, 0.0, 0}, {0.9, 0.9, 0.9, 1}},
{{0.0, 0.0, 0}, {0.9, 0.9, 0.9, 1}},
};

すべてが機能しますか?

4

1 に答える 1

1

問題は、スタックに配列を割り当てる前に、ヒープ上のメモリブロックへのポインタ(メモリアドレス)を持っていることだと思います。したがってsizeof(Vertices)、元のようなものを書くsizeof(Vertices)と、それぞれが 3 つの float 位置と 4 つの float の色を保持する 4 つの頂点になります -> 4 * (3 + 4) * 4(float = 4 バイト) = 112 バイト。ここでsizeof(aPointer)= 4 バイト。OpenGL は C ライブラリであり、操作が非常に簡単ではないため、実際に実行する前に C のスキルを磨く必要があります。また、GLKViewすべてのセットアップ割り当てを簡単にするクラスもあります。

glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW);

頂点の配列と同じサイズを割り当ててみてください。あなたの場合、4 * sizeof(Vertex)。

glBufferData(GL_ARRAY_BUFFER, sizeof(Vertex) * 4, Vertices, GL_STATIC_DRAW);

それがうまくいかない場合は、動的に割り当てられた配列を静的に割り当てられた配列に置き換えることで問題を簡単に修正できます。コンパイル時に必要な大きさがわかっているからです。

Vertex Vertices[4];

次に、ループに値を設定します。

于 2013-10-17T17:53:43.850 に答える