今回は、テクスチャーを張ります。これで、きれいな画像が表示できるようになります。
次のソースを、ダウンロードしてください。
今回は、draw.cpp を書き換えただけです。
頂点情報にテクスチャーの座標情報を追加します。
この値は、通常 UV 値と呼ばれます。U が X、 V が Y 軸の方向に対応します。
// 頂点の定義
typedef struct {
FLOAT x, y, z, rhw; // 位置
DWORD color; // 色
FLOAT tu, tv; // テクスチャーの画像の位置
} CUSTOMVERTEX;
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1)
また、頂点フォーマットの構成、 D3DFVF_CUSTOMVERTEX も追加します。
テクスチャーの情報を格納するのに使われるオブジェクトは、LPDIRECT3DTEXTURE8 です。
LPDIRECT3DTEXTURE8 pTexture = NULL; // テクスチャーに使うオブジェクト
他のオブジェクトと同じように、NULL で初期化しておきます。
さて、初期化です。
今回は、四角形を表示します。
vertices を4つにして、さらに tu、tv の情報を追加します。
tu, tv は、テクスチャーの左及び上端が 0.0f であり、右、下端が 1.0f になります。
頂点数が増えた分、CreateVertexBuffer の一つ目の引数も増えます。
D3DXCreateTextureFromFileEx でテクスチャーを読み込みます。
今回は、sakura.bmp をテクスチャー画像として取り込みました。
HRESULT InitRender(LPDIRECT3DDEVICE8 lpD3DDEV)
{
CUSTOMVERTEX vertices[] = {
// x, y, z, rhw, color, tu, tv,
{ 100.0f, 100.0f, 0.5f, 1.0f, D3DCOLOR_RGBA(0xff, 0xff, 0xff, 0xff), 0.0f,0.0f,},
{ 420.0f, 100.0f, 0.5f, 1.0f, D3DCOLOR_RGBA(0xff, 0xff, 0xff, 0xff), 1.0f,0.0f,},
{ 100.0f, 340.0f, 0.5f, 1.0f, D3DCOLOR_RGBA(0xff, 0xff, 0xff, 0xff), 0.0f,1.0f,},
{ 420.0f, 340.0f, 0.5f, 1.0f, D3DCOLOR_RGBA(0xff, 0xff, 0xff, 0xff), 1.0f,1.0f,},
};
HRESULT hr;
hr = lpD3DDEV->CreateVertexBuffer( 4*sizeof(CUSTOMVERTEX),0,
D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &pVB);
if(FAILED(hr)) return E_FAIL;
VOID* pVertices;
hr = pVB->Lock( 0, sizeof(vertices), (BYTE**)&pVertices, 0);
if(FAILED(hr)) return E_FAIL;
memcpy( pVertices, vertices, sizeof(vertices) );
pVB->Unlock();
D3DXCreateTextureFromFileEx(lpD3DDEV, "sakura.bmp",0,0,0,0,D3DFMT_A8R8G8B8,
D3DPOOL_MANAGED, D3DX_FILTER_LINEAR, D3DX_FILTER_LINEAR,
0, NULL, NULL, &pTexture);
return S_OK;
}
SetTexture で、テクスチャー情報を指定します。
あとは、DrawPrimitive で、表示するだけです。
今回はフォーマットを D3DPT_TRIANGLESTRIP にしました。
D3DPT_TRIANGLESTRIP は、トライアングルストリップといわれるもので、三角形ポリゴンを帯状につなげます。
また、表示するポリゴンの数が(3角形)2枚なので、最後の引数を 2 にします。
void Render(LPDIRECT3DDEVICE8 lpD3DDEV)
{
lpD3DDEV->SetTexture( 0, pTexture);
lpD3DDEV->SetStreamSource( 0, pVB, sizeof(CUSTOMVERTEX) );
lpD3DDEV->SetVertexShader( D3DFVF_CUSTOMVERTEX );
lpD3DDEV->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2 );
}
後片付けは、LPDIRECT3DTEXTURE8 を開放するだけです。
void CleanRender()
{
RELEASE(pTexture);
RELEASE(pVB);
}