頂点の取り扱い-3「TriangleStrip」
About
前回は頂点情報とIndexを定義して複数の三角形ポリゴンの描画(例として四角形の表現)を行った。例によってここで紹介する内容は今回は前回の内容を引き継いでいるので、必要に応じて参照されたい。ここでは複数の連続する三角形ポリゴンの描画について、前回とは異なる手法を取り扱う。頂点を共有する三角形の描画に関してはIndexを利用しない手法があって、ここではそれを解説する。
- SimpleVertex3.zip
- VisualStudio2010 / XNA4.0 で動作を確認しています。
頂点情報の定義
頂点については前回と同様に、四角形を2つの三角形で表現するための4つの頂点を定義する。
private VertexPositionColor[] vertices = { new VertexPositionColor(new Vector3(-1, 0, 0), Color.Red), new VertexPositionColor(new Vector3(-1, 1, 0), Color.Green), new VertexPositionColor(new Vector3(1, 0, 0), Color.Blue), new VertexPositionColor(new Vector3(1, 1, 0), Color.Yellow), };
頂点の描画
勘の良い人やDirectXやOpenGLを触ったことがある人は紹介するまでもない内容で、先の内容(1回目)で紹介した「PrimitiveType」を「TriangleList」から「TriangleStrip」に変更するだけで、Indexを指定しなくても複数の三角形を描画することができるようになる。
//頂点色の有効化 basicEffect.VertexColorEnabled = true; // 2枚のポリゴンを描画する this.GraphicsDevice.DrawUserPrimitives<VertexPositionColor> (PrimitiveType.TriangleStrip,vertices,0,2);
ただし頂点を宣言する順番などに注意する必要がある。三角形を構成する頂点の内、最後の2つと、次に宣言する1つの頂点とで3角形が構成される、その繰り返しになっている。
サンプルの実行結果
見た目は前回の実行時とまったく同じものになる。Indexを定義しない分、楽だし、なにより複雑に頂点の順序を考えることなどしなくて良い。ならなんで早くこっちの手法を解説しなかったのか、という話になるが、それは次の項目で解説する。
2つの手法の違い
今回紹介した方法を使った方が、複数の面を表示するには効率的に見える。実際そうだし、実用的なのも今回の手法であると思う。しかしながら2つの描画方法には次の様なことが考えられる。まず図の左側に示した様な、ある1点を共有する様なポリゴンの描画はTriangleStripでは不可能である。こういった図形が果たしてどれ程登場するかは不明で、必要性は少ないと思われるが確かに不可能である。
また細かい所までプログラミングをすることになると、3DCGソフトから出力されたキャラクタなどのモデルデータを特殊な方法でゲーム内に読み込んだり、その頂点を操作するプログラムが必要になってくる。実際のモデルデータはIndexを利用するようなデータ構造である場合が多く、そういったプログラムを実装する場合には先に紹介した手法が利用される。
また実装の都合上、TriangleListの方が、先に実装されることは明白である。完全に余談になるが、まず3つの頂点から三角形を描画するプログラムを実装し、次いで連続する三角形を描画するプログラムを実装するのは、少しでもプログラムを書いたことがある人にとっては明白で、こういった理由もあってTriangleListとTriangleStripとが存在することも十分考えられる。