頂点情報初期化関数について

今までのプログラム

今まで説明してきたとおり、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;

}

動作確認

  1. (4)で作成したプログラムに上記修正を行い、青い四角形が同じように表示されることを確認する
  2. 引数を変更し、思い通りの場所に思い通りの形で四角形が表示されるかどうかを確認する

BACK(ポリゴンの描画(四角形)) NEXT(画像の描画(テクスチャ・マッピング))