0

私はOpenGLESを初めて使用しますが、Objective-CとiOSの開発にはかなりの経験があります。これまでのところ、次のコードを使用して、頂点の配列と対応するインデックスの配列を定義することにより、頂点バッファーオブジェクトを使用して形状を描画および色付けすることに問題はありませんでした。

GLuint vertexBuffer;
glGenBuffers(1, &vertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(Verticies), Verticies, GL_STATIC_DRAW);

GLuint indexBuffer;
glGenBuffers(1, &indexBuffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(Indices), Indices, GL_STATIC_DRAW);

次に、次のコードを使用して画面に描画します。

glDrawElements(GL_TRIANGLES, sizeof(Indices)/sizeof(Indices[0]), GL_UNSIGNED_BYTE, 0);
[_context presentRenderbuffer:GL_RENDERBUFFER];

これは、コードで自分自身を定義できる基本的な形状にはすべて問題ありません。これで、3Dグラフィックプログラムからエクスポートされた.hファイルを生成してもらいました。このファイルには、形状を定義するために必要な情報が含まれていますが、インデックス配列は含まれていません。代わりに、インデックス情報が頂点配列に埋め込まれています。頂点配列には、描画される順序を定義する繰り返し座標があります。以下のサンプルコードを参照してください。また、法線の配列とテクスチャ座標の配列もあります。以前のように個別の頂点/インデックス配列とは対照的に、このデータをどのように使用(読み取り:描画)するかを誰かに教えてもらえますか(またはチュートリアル/ガイドを教えてください)?前もって感謝します!

#define poleNumVerts 276

static const float poleVerts [] = {
  // f 1/1/1 2/2/2 3/3/3
  -0.0170377877807436, -0.00478429549256308, 0.5,
  -0.0170377877807436, 0.00409214741631937, 0.5,
  -0.0176220932500109, -0.00034605799118996, 0.5,
  // f 2/2/2 1/1/1 4/4/4
  -0.0170377877807436, 0.00409214741631937, 0.5,
  -0.0170377877807436, -0.00478429549256308, 0.5,
  -0.015324690688248, -0.00892006666692703, 0.5,
  // f 2/2/2 4/4/4 5/5/5
  -0.0170377877807436, 0.00409214741631937, 0.5,
  -0.015324690688248, -0.00892006666692703, 0.5,
  -0.015324690688248, 0.00822795297696595, 0.5,
  // f 5/5/5 4/4/4 6/6/6
  -0.015324690688248, 0.00822795297696595, 0.5,
  -0.015324690688248, -0.00892006666692703, 0.5,
  -0.012599557156627, 0.0117794232669002, 0.5,
  // f 6/6/6 4/4/4 7/7/7
  -0.012599557156627, 0.0117794232669002, 0.5,
  -0.015324690688248, -0.00892006666692703, 0.5,
  -0.012599557156627, -0.0124715369568613, 0.5,
  // f 6/6/6 7/7/7 8/8/8
  -0.012599557156627, 0.0117794232669002, 0.5,
  -0.012599557156627, -0.0124715369568613, 0.5,
  -0.0090480845742739, -0.015196688827833, 0.5,

  ...... <code truncated>... };


static const float poleNormals [] = {
  // f 1/1/1 2/2/2 3/3/3
  0, 0, 1,
  0, 0, 1,
  0, 0, 1,
  // f 2/2/2 1/1/1 4/4/4
  0, 0, 1,
  0, 0, 1,
  0, 0, 1,
  // f 2/2/2 4/4/4 5/5/5
  0, 0, 1,
  0, 0, 1,
  0, 0, 1,
  // f 5/5/5 4/4/4 6/6/6
  0, 0, 1,
  0, 0, 1,
  0, 0, 1,
  // f 6/6/6 4/4/4 7/7/7
  0, 0, 1,
  0, 0, 1,
  0, 0, 1,
  // f 6/6/6 7/7/7 8/8/8
  0, 0, 1,
  0, 0, 1,
  0, 0, 1,
  // f 6/6/6 8/8/8 9/9/9

  ...... <code truncated>...};

static const float poleTexCoords [] = {
  // f 1/1/1 2/2/2 3/3/3
  0.939514, 0.37333,
  0.928115, 0.619208,
  0.950000, 0.49702,
  // f 2/2/2 1/1/1 4/4/4
  0.928115, 0.619208,
  0.939514, 0.37333,
  0.897372, 0.25657,
  // f 2/2/2 4/4/4 5/5/5
  0.928115, 0.619208,
  0.897372, 0.25657,
  0.875352, 0.73157,
  // f 5/5/5 4/4/4 6/6/6
  0.875352, 0.73157,
  0.897372, 0.25657,
  0.795305, 0.826446,
  // f 6/6/6 4/4/4 7/7/7
  0.795305, 0.826446,
  0.897372, 0.25657,
  0.826446, 0.154695,
  // f 6/6/6 7/7/7 8/8/8
  0.795305, 0.826446,
  0.826446, 0.154695,
  0.731570, 0.074647,
  // f 6/6/6 8/8/8 9/9/9
  0.795305, 0.826446,
  0.731570, 0.074647,
  0.693430, 0.897371,

  ..... <code truncated>.... };
4

1 に答える 1

2

インデックスのリストがない場合は、すべての頂点を順番に描画することが期待されているようです。glDrawArraysではなくでこれを行うことができますglDrawElements。これらは同じですが、前者はインデックス配列を使用しません(のインデックス配列をに渡すのと同じです{0, 1, 2, 3, ...}glDrawElements

于 2012-08-06T14:41:14.337 に答える