メインメニューを開く

インデックスバッファ英語:indexed buffer)とは、主に3DCGで使われる用語で、頂点バッファ(頂点データの配列)の無駄をなくすための配列である。

ポリゴンの世界では四角形は「三角形が2個」で表される。 五角形でも六角形でもそれ以上でも基本は「三角形が◯個」という形式になる。 たとえば四角形があるとすると、それは三角形が2個、全部で6頂点のデータになる。

Vertex.png

MonoGame風に書くとこんな感じ。

var vertices = new VertexPositionColor[6];

vertices[0] = new VertexPositionColor(new Vector3(-10, -10, 0), Color.Green);
vertices[1] = new VertexPositionColor(new Vector3(-10, +10, 0), Color.Green);
vertices[2] = new VertexPositionColor(new Vector3(+10, -10, 0), Color.Green);

vertices[3] = new VertexPositionColor(new Vector3(-10, +10, 0), Color.Red);
vertices[4] = new VertexPositionColor(new Vector3(+10, +10, 0), Color.Red);
vertices[5] = new VertexPositionColor(new Vector3(+10, -10, 0), Color.Red);

この6頂点のうち、2頂点は重複した値であり、データしては無駄である。 頂点データにはXYZ座標の他にテクスチャ座標や法線なども含まれる。 頂点データ1個1個でいえば今の御時世のパソコン向けのグラフィックボードはメモリ容量もメモリ帯域も豊富なので気にするレベルではないが、ポリゴン数が数万、数十万となると結構バカにできない容量になる。とくにスマートフォン向けにゲームや3Dアプリを開発する場合にはパソコンほど豊富なリソースを積んでいないことも多い。だれもがSnapdragonハイエンドを使っているわけもなくMediaTekもあればKrinもありOMAPもある。

そこで頂点データにインデックスを付けて重複排除したデータとして保持しようというのがインデックスバッファである。

Indexed.png

これもMonoGame風に書くとこんな感じ。

var vertices = new VertexPositionColor[4];
vertices[0] = new VertexPositionColor(new Vector3(-10, -10, 0), Color.Green);
vertices[1] = new VertexPositionColor(new Vector3(-10, +10, 0), Color.Green);
vertices[2] = new VertexPositionColor(new Vector3(+10, -10, 0), Color.Green); 
vertices[3] = new VertexPositionColor(new Vector3(+10, +10, 0), Color.Red);

var indeces = new short[6];
indeces[0] = 0; indeces[1] = 1; indeces[2] = 2; // 三角形1
indeces[3] = 0; indeces[4] = 2; indeces[2] = 3; // 三角形2
  • 頂点バッファは重複排除した4個。
  • インデックスバッファは上記の頂点バッファの添字を指す6個

インデックスバッファが保持しているのは頂点バッファの添字なのでせいぜいInt16かInt32くらいの大きさしかない。 上記のような平面の四角形では6頂点が4頂点に減っただけだが、たとえばこれが立方体になると頂点バッファだけだと1面6頂点が6面の計36頂点となるのが、インデックスバッファを使えば8頂点で済む。スゴーイ!!

関連項目編集