通常、2Dゲームでは矩形(四角形)を使って画像表示を行うので、扱うポリゴンの形は四角形が基本となると考えてよい。
しかし、Direct Graphicsでは四角形のポリゴンを表示することができないので、三角形ポリゴンを2つ組み合わせて四角形を形成し、組み合わせた2つの三角形ポリゴンを1つの四角形ポリゴンとして利用する。
三角形が2つなら頂点は6つ必要だが、頂点を共有することにより、4つの頂点で表現が可能である。

(3)で作成したプログラムを修正し、四角形ポリゴンを描画する手順を解説する。
頂点情報が4つになったため、配列の要素数を4に修正する。
// グローバル変数
HWND hWnd; // ウィンドウハンドル
BOOL g_appActive = FALSE; // ウィンドウの状態
char szWinName[] = "Exer004"; // ウィンドウクラス用文字列
char szWinTitle[] = "DirectX Graphicsでの2D表示"; // ウィンドウクラス用文字列
LPDIRECT3D8 gl_lpD3d = NULL; // Direct3D8インターフェイス
LPDIRECT3DDEVICE8 gl_lpD3ddev = NULL; // Direct3DDevice8インターフェイス
D3DPRESENT_PARAMETERS gl_d3dpp; // ディスプレイパラメータ
BYTE g_FrameNo = START_INIT; // フレーム選択用
BYTE gl_KeyTbl[256]; // キーボードの状態を格納
TLVERTX VertexDataTbl[4]; // 頂点情報配列
4つ目の頂点座標を初期化するよう、頂点情報初期化関数(InitVertex関数)を修正する。
//----------------------------------------------------------------------------------------
// 関数名 : InitVertex()
// 機能概要: 頂点データを格納する
//----------------------------------------------------------------------------------------
void InitVertex(LPTLVERTEX v)
{
//頂点配列をゼロクリア
ZeroMemory(v, sizeof(TLVERTX));
//---頂点A1のデータ定義
v[0].x = 100.0f; // 頂点X座標
v[0].y = 100.0f; // 頂点Y座標
v[0].z = 0.0f; // 頂点Z座標
v[0].rhw = 1.0f; // 2Dを扱うときの値
v[0].color = D3DCOLOR_XRGB(0,0,255); // 頂点色
//---頂点A2のデータ定義
v[1].x = 400.0f;
v[1].y = 100.0f;
v[1].z = 0.0f;
v[1].rhw = 1.0f;
v[1].color = D3DCOLOR_XRGB(0,0,255);
//---頂点A3のデータ定義
v[2].x = 400.0f;
v[2].y = 400.0f;
v[2].z = 0.0f;
v[2].rhw = 1.0f;
v[2].color = D3DCOLOR_XRGB(0,0,255);
//---頂点A4のデータ定義
v[3].x = 100.0f;
v[3].y = 400.0f;
v[3].z = 0.0f;
v[3].rhw = 1.0f;
v[3].color = D3DCOLOR_XRGB(0,0,255);
}
ポリゴンの描画はDrawPrimitiveUPメソッドを使って行われる。ここでポリゴン数を2にすれば、頂点情報から2つのポリゴンを描画する。頂点情報は4つなので、四角いポリゴンに見える。
//-----------------------------------------------------------------------------
// 関数名 : StartFrame()
// 機能概要: スタート画面処理
//-----------------------------------------------------------------------------
void StartFrame(void)
{
/* 描画処理 */
// 四角形ポリゴンをバックバッファに転送
gl_lpD3ddev->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, VertexDataTbl, sizeof(TLVERTX));
// リターンキーが押されたら、ゲーム開始
if ( gl_KeyTbl[VK_RETURN] & 0x80 ) g_FrameNo = GAME_INIT;
}
※動作確認
| BACK(ポリゴンの描画(三角形)) | NEXT(頂点情報初期化関数について) |