今回は、テクスチャーを張ります。これで、きれいな画像が表示できるようになります。
次のソースを、ダウンロードしてください。
今回は、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); }