今まで説明してきたとおり、DirectX Graphicsではポリゴンを描画することしかできない。そして、平面の四角形ポリゴンを作成し、その上に画像を貼り付けることによって2D画像を描画できる。
ポリゴンは頂点情報の組み合わせで作成され、四角形ポリゴンを作成するには4つの頂点情報が必要である。4つの頂点情報は、頂点情報初期化関数で次のようにセットするように解説した。
// 頂点情報構造体
typedef struct tag_dx_TLVERTEX {
float x, y, z; //位置情報
float rhw; //頂点変換値
D3DCOLOR color; //頂点カラー
float tu, tv; //テクスチャ座標
}TLVERTX, *LPTLVERTEX;
// 頂点情報格納変数
TLVERTX VertexDataTbl[4]; // 頂点情報配列
// 初期化用関数を実行し、VertexDataTbl配列に値をセット
InitVertex(VertexDataTbl);
// 初期化用関数
//----------------------------------------------------------------------------------------
// 関数名 : 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);
}
このプログラムの場合、頂点X,Y座標はそれぞれ(100,100)(400,100)(400,400)(100,400)である。
四角形ポリゴンは、ビットマップファイルなどの2次元画像を貼り付けるために使用する。この時、2次元画像は矩形でしか取り込めないため、貼り付けられるポリゴンも同じ大きさ・形でなければ画像がゆがんでしまう(わざとゆがませることは今回は考えない)。
矩形とは長方形のことであり、左上と右下のX,Y座標で表現できる。

この画像が矩形(長方形)であるとするならば、左上と右下の頂点座標さえ分かれば、残りの右上と左下の頂点座標も求めることができる。
例えば右上の座標を(x1,y1)、左下の座標を(x2,y2)とすると、左上の座標は(x2,y1)、右下の座標は(x1,y2)となる。

つまり、四角形ポリゴンは4つの頂点情報を必要とするが、左上と右下の座標から4つの頂点座標を求められることが分かる。
(4)で作成したプログラムを修正し、頂点情報初期化時に四角形の2つの座標を与え、その情報を元に4つの頂点座標をセットするように作り変える。
void InitVertex(LPTLVERTEX, float, float, float, float); // 頂点情報格納
//---------------------------------------------------------------------------------------- // 関数名 : InitVertex() // 機能概要: 頂点データを格納する //---------------------------------------------------------------------------------------- void InitVertex(LPTLVERTEX v, float x1, float y1, float x2, float y2) { //頂点配列をゼロクリア ZeroMemory(v, sizeof(TLVERTX)); //---頂点A1のデータ定義 v[0].x = x1; // 頂点X座標 v[0].y = y1; // 頂点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 = x2; v[1].y = y1; v[1].z = 0.0f; v[1].rhw = 1.0f; v[1].color = D3DCOLOR_XRGB(0,0,255); //---頂点A3のデータ定義 v[2].x = x2; v[2].y = y2; v[2].z = 0.0f; v[2].rhw = 1.0f; v[2].color = D3DCOLOR_XRGB(0,0,255); //---頂点A4のデータ定義 v[3].x = x1; v[3].y = y2; v[3].z = 0.0f; v[3].rhw = 1.0f; v[3].color = D3DCOLOR_XRGB(0,0,255); }
//-----------------------------------------------------------------------------
// 関数名 : StartInit()
// 機能概要: スタート画面初期化処理
//-----------------------------------------------------------------------------
void StartInit(void)
{
//--------------------------------------------------- 各変数の初期化
// 頂点データを格納する
InitVertex(VertexDataTbl, 100.0f, 100.0f, 400.0f, 400.0f);
//--------------------------------------------------- フレームナンバーセット
g_FrameNo = START_FRAME;
}
| BACK(ポリゴンの描画(四角形)) | NEXT(画像の描画(テクスチャ・マッピング)) |