ポリゴン

■ポリゴン

ポリゴンとは3つ以上の頂点で形成される多角形のことです。
頂点にはXやYのような座標情報の他に様々な情報を設定することができます。
gmpg_0035
上の表にある全ての頂点情報を使用する必要はありません。
	頂点情報の例(頂点座標とカラー情報の設定):
		struct VertexInfo {
			D3DXVECTOR3 m_Pos;
			DWORD m_Color;
		};

DirectXでは描画で使用する頂点情報の内容をDirectX側へ伝える必要があり、
設定内容は構造体の宣言の順番で行います。
	例:
		#define VERTEX_FVF (D3DFVF_XYZ | D3DFVF_DIFFUSE)

●ポリゴンの描画方法
	DirectXでは頂点を利用してポリゴンを作成する際に
	どのようなポリゴンを作成するか決めることができます。

	・TriangleList(トライアングルリスト)
		トライアングルリストは三角形一つ一つを作成するために
		頂点を3つずつ設定していく方法です。
		設定する頂点数は3で割り切れる数にしなければいけません。
		gmpg_0036

	・TriangleStrip(トライアングルストリップ)
		トライアングルストリップは他の三角形の頂点二つと
		新しい頂点一つで次々と三角形を作成していく方法です。
		gmpg_0037
	
	・TriangleFan(トライアングルファン)
		トライアングルファンは一つの頂点を使いまわして扇のように
		三角形を作成していく方法です。
		gmpg_0038

■頂点バッファ

頂点バッファとはDirectXやOpenGLで
使用されている頂点情報を格納したメモリ領域のことです。
この領域はVRAM上に作成されます。
DirectXではCreateVertexBufferを使用して頂点数分の領域をVRAM上で確保しています。

VRAM上のメモリ領域はユーザーが簡単に触っていけない
メモリ領域になっていますのでデータの変更などは簡単にはできません。
使用するときはまずメモリ領域を使用することを知らせるためにLock関数を使用します。
これで、他の処理に邪魔されずそこのメモリ領域での作業を占有できます。
その後、メモリの変更作業が完了したら占有を解除するためにUnLock関数を使用します。

●DrawPrimitiveとDrawPrimitiveUpの違い
	DrawPrimitiveとDrawPrimitiveUpの違いを説明したいと思います。
	
	・DrawPrimitive
		・頂点情報がVRAM上に置かれるので描画速度は速い
		・頂点の変更が必要な場合LockとUnLockを使用する必要があり、
		 ロック処理を繰り返すとパフォーマンスが低下する
		・頂点を数多く持つモデルファイルなどを
		 描画する際に真価を発揮する
		
	・DrawPrimitiveUp
		・頂点情報は通常のメモリに置かれるので
		 DrawPrimitiveと比べると遅い
		・頂点情報を動的に変更したい場合、LockとUnLockは
		 処理が重いのでこちらの方がパフォーマンスが良い
		・板ポリなどの動的に変更しかつ頂点数が少ないオブジェクトでは
		 こちらを使用する方が適している

■インデックスバッファ

インデックスバッファとはポリゴンを
作成するための頂点番号リストのことです。
インデックスバッファの目的は「頂点情報」と「ポリゴンを作成する頂点」を
分離することにあります。
板ポリや頂点数の少ないポリゴンでは頂点バッファのみでも問題ありませんが、
モデルファイルなどのポリゴンメッシュを作成するためには
インデックスバッファによる頂点情報の管理が必要不可欠になります。
	
	ポリゴンメッシュ:
		ポリゴンメッシュはポリゴンの集まりのことで、メッシュとも呼ばれています。
		メッシュを物体として意味のある形にした物がモデルファイルになります。

	gmpg_0041
	
●インデックスバッファを使用した場合のメリット
	インデックスバッファを使用した場合のメリットを書きたいと思います。

	・頂点バッファの削減
		この後説明しますが、インデックスバッファを使用しない場合、
		必ずといっていいほど頂点情報の重複が発生します。
		インデックスバッファを使用することにより、
		重複が解消され、頂点バッファの数を減らすことが可能です。

	・処理速度の向上
		頂点バッファの削減で必要な頂点計算の数も減り、
		処理速度の向上が見込めます。

●頂点情報の重複
	上のメリットの項目で出てきた頂点情報の重複について説明したいと思います。
	ポリゴンメッシュのようなポリゴンを数多く持っているオブジェクトでは
	同じ頂点情報を使用している箇所が存在します。
	しかし、頂点バッファのみを使用した場合はその頂点情報は同一のものではなく、
	別の頂点情報として扱われます。
	トライアングルリストは性質上三角形のポリゴン一つ一つを
	ちゃんと設定しなければいけないのでイメージとしてわかりやすいと思います。
			
		gmpg_0039
	
	上の図はトライアングルリストで2枚の三角形を使用した四角形のイメージです。
	頂点の1と4、3と5は同じ値ですが、頂点情報としては別物として扱われます。
	次は床などの正方形ポリゴンが複数並んでいる場合のイメージ図です。
		
		gmpg_0040
		
	このように頂点2と24以外は重複しており、ポリゴンがたった8つでも
	数多くの頂点が重複していることがわかります。

	・頂点情報の重複による問題点
		重複による問題点は二つあります。
		1.メモリの無駄遣い
			重複している頂点情報でも一つ一つはきちんとメモリ上に
			領域を確保する必要があります。
			このような無駄といえるメモリの確保は無視することはできません。
			
		2.頂点の変更がしにくい
			重複している箇所が多いということはその頂点を変更する場合
			重複している頂点情報全てを変更しなければいけません。
			修正漏れがあった場合は意図した内容と違った形に
			描画されることになりますので、慎重に修正を行わなければいけません。

	・インデックスバッファを使用した重複の回避
		インデックスバッファを使用した場合、問題点は改善されます。
		1.メモリの無駄遣い
			ポリゴンの描画はインデックスバッファの内容を元にして
			頂点バッファの情報を使用して行われます。
			同じ頂点情報を使用する場合はその頂点情報のインデックスを
			インデックスバッファで設定すればいいので、
			頂点バッファ内に重複した内容が作成されることはありません。
			これによって、無駄な頂点情報がなくなり、メモリの節約になります。

		2.頂点の変更がしにくい
			頂点バッファの内容をひとつ修正するだけで、
			その頂点情報のインデックスを使用している
			全てのポリゴンに影響されることになります。
			これにより、簡単に頂点情報を修正できるようになりました。

	・インデックスバッファの欠点
		インデックスバッファの欠点は数がポリゴンの数が少ない場合、
		頂点バッファのみ場合よりもメモリを多く使用してしまう可能性があります。
		※頂点構造体の内容に左右されますので、必ずというわけでありません。

■3Dモデルの表現方法

3Dモデルの表現方法はワイヤーフレーム、サーフェス、ソリッドの3種類があります。
ゲームで使用されているような3DCGはサーフェスモデルにあたります。

●ワイヤーフレームモデル
	ワイヤーフレームモデルは頂点同士を線のみで表現したモデルのことです。
	面に関するデータを持っていないため陰線消去を行うことができず、
	立体感をつかみにくくなっています。
	ワイヤーフレームのメリットとしてはデータ量が少ないことから
	表示が速いところです。

	・ワイヤーフレームレンダリングについて
		CG描画の手法としてワイヤーフレームレンダリングと
		呼ばれるものがあります。
		これは面成分などを持っているポリゴンをあえて
		ワイヤーフレームとして描画する方法です。
		ワイヤーフレームモデルとの違いはワイヤーフレームレンダリングは
		面成分の情報を持っているので陰線消去などの
		ワイヤーフレームモデルにはできないことが可能です。
		
		gmpg_0042

●サーフェスモデル
	サーフェスモデルはモデルの表面のみが定義された構造になっています。
	中身が空洞のため張り子、張りぼてとも形容されますが、
	一般的な3DCGの世界において、もっとも使用されている方式です。
	
	gmpg_0043

●ソリッドモデル
	ソリッドモデルは体積を持った(中身のつまった)構造になっており、
	中身のないサーフェスモデルと比較されます。
	ソリッドモデルはCADなどで使用され、物理シミュレーションなどの
	工業分野で用いられています。
	
	gmpg_0044