トライアングルストリップの作り方 その2

3DCGの描画速度を向上させる有効な手段としてトライアングルストリップ(以下ストリップと)というのがある。


2008-03-09 - malibu-bulldogの日記


にデータ構造の基本を書きました。要は複数の三角形に対して辺を共有するなら座標変換等の計算を省略できるよねってのがミソです。

で,このトライアングルストリップを作るにはどうしたらいいか?

3DCGのデータは頂点の座標値と三角形のデータから構成されている場合が多い。

(3DCGのデータ構造に関しては3dsファイルは複雑 - malibu-bulldogの日記

三角形のデータというのは三つの頂点をどのような順番で結ぶかという連結情報になっている場合がほとんど。


さて,この連結情報からどうやってトライアングルストリップを作るか?

連結情報から辺を共有しているもの同士を見つける


ってことが基本になる。この場合の辺は2つの頂点から構成されます。

しかし,ストリップはただ辺を共有しているだけじゃダメです。


一定のルール上で辺を共有する必要がります。

そのルールとはOpenGLDirectXといったグラフィックパイプラインの入り口を提供するライブラリに依存しますが,基本は次ようなものです。


  • 最初の三角形(1-2-3)を描画する
  • その時2-3の頂点がストリップ用のキャッシュに乗る
  • つぎに4の頂点が送られる
  • 3-2-4で三角形を作る
  • 3-2と入っていたキャッシュに今度は3と入れ替わって4が入る
  • 5の頂点が送られる
  • 4-2-5で三角形を作る
  • 今度は2が消えて5が入る

つまりキャッシュ上は二つ分の頂点情報がLIFO方式で格納される(ここらへんはGLのリファレンスに書いてあります)。

また,描画する三角形のインデックス順序は右回りと左回りが交互になる事も注意です。



これに気をつけながら三角形の集合からストリップを作る事になります。


まぁややこしいデータですが,手間かかる分効果は絶対です。

固定パイプライン上(自分で3D描画のアルゴリズムをいじらない場合の描画処理の事)なら2倍はやくなるでしょう!
いや,それ以上かも?