5-2 ポリゴン

ここでは3Dに必ず出てくるポリゴンについて説明しています。

■頂点と面

ここではまずポリゴンを構成する頂点について説明をします。

頂点とは簡単に言うとただの点のことですが、点と言うのはあくまでも位置を指しているだけであり、
画面上でのピクセルを指しているわけではありません。

また3DではXYZの座標を持った点であり、これは画面とかは関係なくある仮想的な空間上での位置を示します。

そしてある空間上にこの点が3つありこれらをそれぞれ繋げると三角形が出来ますが、
この三角形をポリゴンと言い、そこに出来る平面をフェースまたは単にと言います。

3Dではこれを最小単位として扱い、例えば3Dのモデルなどはこのポリゴンをいくつも組み合わせて作ります。

ちなみに昔ドリキャスは秒間300万ポリゴンと言って売りだしていましたが、
これはこのポリゴンを1秒間に何個表示出来るかを表しています。
しかし普通ゲームというのは秒間60フレームで表示するため、
1フレームで表示出来るポリゴン数を計算すると実は5万ポリゴンしかありません。
この値は最大値であり実際には他の処理も絡んでくるため、例えばアクションゲームなどで使用される
3Dのキャラクターは背景なども考慮すると1000ポリゴン以下で作る必要があったりしたため、
結局はあまりきれいなポリゴンキャラクターというのは作れませんでした。

ポリゴンの面は光の当たり方により明るくなったり暗くなったりしますが、
この時明るさの計算に必要なのが太陽の放射方向と面から垂直に出ている法線です。
これらを計算することで立体物の陰を表現することが出来ますが、この処理を3Dではライティングと言います。

ライティングは任意にON/OFFを切り替えられるので、必要無ければライティングを切ることで
ポリゴンの色(頂点カラー)をそのままベタで描画させることも出来ます。

ちなみに右図のように点が4つしかないにも関わらず面が4つありますが、
よく見ると同じ頂点がそれぞれの面で何回も使われています。
このような頂点を共有頂点と言い、この例では4面で12頂点必要になってしまうのを1/3まで減らすことが出来ます。
※実際には法線の向きは頂点に含まれるため、面ごとに法線が異なる場合はそれぞれ別々の頂点にしなければなりませんが、
 ここでは共有頂点の説明となるため法線はあまり気にしないで下さい

この場合1つの面を定義するためにどの頂点を参照しているのかというリストが必要となりますが、
この情報を羅列したものをインデックスバッファと言います。
インデックスバッファの中身は通常は16bit整数型の羅列となるので、
実質1つの頂点バッファには最大で65536個分の頂点が定義出来ます。
※現在は32bit整数も使えるので4億個まで頂点が定義出来ます

対して頂点だけのリストを頂点バッファまたは英語でバーテックスバッファと言い、
共有頂点を使用する場合は必ずこの2つのバッファが必要となります。

なお、参照を使わず面ごとに単に3つの頂点を羅列したバッファも頂点バッファとして作れるので、
この場合はインデックスバッファは必要ありません。

Direct3D9で頂点を描画させる場合、引数に頂点バッファの中身の仕様を定数として指定するだけなので、
この情報が間違っていない限りは特に難しいことをせずに画面に描画させることが出来ます。
※逆にどのように頂点バッファを作ったかをプログラム側できちんと管理しておく必要があります

ちなみにポリゴンを実際に描画することを3Dではレンダリングと言います。

例えばアニメ調に描画することをトゥーンレンダリングといい、
Direct3D9でも自前でシェーダーを書くことで結構簡単に出来ます。

■板ポリゴン

さて、とりあえず3Dについてはあまり詳しくやってもしょうがないので、
ここではこのポリゴンを利用して画面に2Dとして表示させるやりかたを説明します。

まず2Dとして表示させるということは、つまり奥行きを考える必要が無いということです。
また頂点の座標はワールド空間上ではなく画面上でのスクリーン座標を直接指定すればよいので、
ワールドからスクリーン座標に変換するためのカメラなどの計算は一切必要ありません。

さらに1ポリゴンで1つの三角形ということなので、2Dの四角形を表現するためには
単純に2ポリゴンを使えば良いという事になります。

さて2ポリゴンということは頂点は2×3で6個必要になりますが、
下の図を見ると2つの頂点は共有させることが出来そうです。
そう考えるとここでは頂点は4つあれば良いということになります。



※色が違いますが影とかではなく実際はどちらも平面です

このようにポリゴンで作られた2D用の四角形を一般的に板ポリゴンといいます。

■ポリゴンの表と裏

実はポリゴンには表と裏があります。
そして通常はポリゴンは表面しか表示しません。

ただしDirect3Dには表示方法として「表面のみ」か「裏面のみ」そして「両面表示」ということが可能です。
このため絶対に裏面は表示されないという訳ではないので心配しないでください。

単純に両面表示を行った場合は2倍処理がかかるということなので、
速度を優先するならば両面表示はやらないほうがいいというだけです。

なお、2Dの場合は画像を上下や左右反転したい時があると思いますが、
この場合は裏面の表示が必要になるのでこのサイトでは基本的に両面表示を行っています。

ちなみにポリゴンの表と裏を決めるのは頂点の順番座標系によります。

このサイトでは右手系を使うため、上記の板ポリゴンの説明の点1~点3のように、
右回りのポリゴンの場合は手前が表となります。
※左手系の場合は頂点の順番を逆にしなければなりませんが、
 この場合は3つの頂点のうち後方の2つを入れ替えることで可能です


さて、上記の板ポリゴンについて不思議に思った人もいるかもしれませんが、
よく見ると2つめのポリゴンは点2~点4となりこれは左回りになっています。

これじゃあ表示されないんじゃないかと思うかもしれませんが、
共有頂点を使ってこのように配置された頂点は、描画時に交互に表と裏が入れ替わります。

これにより1つ目は右回りが表、2つ目は左回りが表と解釈されるため、
結果的にどちらも表面を向いているということになります。

以下はこの面を連続で定義した場合の例です。

 ①点1→点2→点3
 ②点2→点3→点4
 ③点3→点4→点5
 ④点4→点5→点6

ちなみにこのような形式で作られた頂点バッファを三角形ストリップ(トライアングルストリップ)と言い、
用途としては道路のような長い面を作るのに適しています。


ひとまずこのあたりは結構難しいため、板ポリを作るということに限定してしまえば、
4つの頂点で四角形を定義すればOKなんだと思ってください。