テクスチャーを張る


~これで、それっぽく見えますね~




■今回のファイルは

今回は、テクスチャーを張ります。これで、きれいな画像が表示できるようになります。

次のソースを、ダウンロードしてください。

今回は、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);
}




もどる

imagire@gmail.com