ピクセル座標で定義した矩形にテクスチャを貼り付ける

DirectX の D3DXCreateTextureFromFile で画像を読み込んで、ピクセル座標で定義した矩形に貼り付けます。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プログラムの説明

  1. 空の新規プロジェクト(TextMap)を作成して、次のファイルをプロジェクトのフォルダーに格納して下さい。
    プロジェクト/既存項目の追加からプログラムファイルとヘッダファイルをプロジェクトに追加して下さい。
    myd3d.h と myd3d.cpp は Object Class Library から取得して下さい。
    ファイル名 ファイルの説明
    textmap.cpp 「プログラムの説明」を参考に作成して下さい
    ayu.jpg テクスチャ画像
    myd3d.h MyD3D Object Class ヘッダファイル
    myd3d.cpp MyD3D Object Class プログラムファイル
  2. #define と #include と Global Area の定義です。
    *myd3d が MyD3D Object Class の定義です。
    g_hWnd はウインドウのハンドルを保持する領域です。
    g_pDEV は Direct3D のデバイスです。
    g_pTexture がポリゴンに貼り付けるテクスチャの定義です。
    g_bActive はウインドウが Active 状態のフラグです。
    imgfile[] がテクスチャに使う画像ファイルです。
        #define     NAME   "Rect AYU"
        #include    "MyD3D.h"
    
        //Global Area
        MyD3D                   *myd3d     = NULL;
        HWND                    g_hWnd     = NULL;
        LPDIRECT3DDEVICE9       g_pDEV     = NULL;
        LPDIRECT3DTEXTURE9      g_pTexture = NULL;
        bool                    g_bActive  = false;
        char                    imgfile[]= "ayu.jpg";
        
  3. テクスチャを貼り付ける矩形ポリゴンの定義です。
    三角形を組み合わせた矩形(TRIANGLESTRIP)をピクセル座標で定義します。
    ポリゴンが裏向きになると描画されないので注意して下さい。
    tu,tv がテクスチャ座標の定義です。
    テクスチャ座標は「左上=0.0f, 0.0f, 右下=1.0f, 1.0f」とした float タイプで設定します。

    color の設定でテクスチャの色を調整することができます。
        #define     FVF_TLVERTEX (D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1)
        // 頂点フォーマットの定義
        struct  TLVERTEX
        {   float       x,y,z;
            float       rhw;
            D3DCOLOR    color;
            float       tu,tv;
        };
    
        // 頂点を準備
        TLVERTEX vertex[4]=
        {   {  40.0f,  30.0f,  0,  1.0f,  0xffffffff,  0,  0  },    //左上
            { 440.0f,  30.0f,  0,  1.0f,  0xffffffff,  1,  0  },    //右上
            {  40.0f, 320.0f,  0,  1.0f,  0xffffffff,  0,  1  },    //左下
            { 440.0f, 320.0f,  0,  1.0f,  0xffffffff,  1,  1  },    //右下
        };
        
  4. WinMain() はいつもと同じです。
    描画は CALLBACK 関数の WM_PAINT: から行っています。
    今回のような静止した画像は Windows と同じように WM_PAINT: で描画することができます。
        int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int)
        {   MSG     msg;
    
            WNDCLASSEX wc = { sizeof(WNDCLASSEX),CS_CLASSDC,MsgProc,0L,0L,hInst,
                              NULL,NULL,NULL,NULL,NAME,NULL };
            if (RegisterClassEx(&wc)==0)    return FALSE;
            g_hWnd = CreateWindowEx(0,NAME,NAME,WS_OVERLAPPEDWINDOW,
                           CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
                           NULL,NULL,hInst,NULL);
            if (FAILED(InitD3D()))    return FALSE;
    
            ShowWindow(g_hWnd,SW_SHOWDEFAULT);
            UpdateWindow(g_hWnd);
            ZeroMemory(&msg,sizeof(msg));
            while(msg.message!=WM_QUIT)
            {   if (PeekMessage(&msg,NULL,0U,0U,PM_REMOVE))
                {   TranslateMessage(&msg);
                    DispatchMessage(&msg);
                }
            }
            UnregisterClass(NAME,wc.hInstance);
            return TRUE;
        }
        
  5. CALLBACK 関数の WM_PAINT: から Draw() 関数で描画します。
    ESCAPEキーまたは F12キーを押すとプログラムが終了します。
        LRESULT WINAPI MsgProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
        {
            switch(msg)
            {   case WM_ACTIVATE:
                    g_bActive= (LOWORD(wParam)!=0);
                    break;
                case WM_PAINT:
                    Draw();
                    return 0L;
                case WM_KEYDOWN:
                    switch(wParam)
                    {   case VK_ESCAPE:
                        case VK_F12:
                            PostMessage(hWnd,WM_CLOSE,0,0);
                            return 0L;
                    }
                    break;
                case WM_DESTROY:
                    Cleanup();
                    PostQuitMessage(0);
                    return 0L;
            }
            return DefWindowProc(hWnd,msg,wParam,lParam);
        }
        
  6. DirectX3D の初期化を行う InitD3D() 関数です。
    MyD3D Object Class をインスタンス化して、インターフェースを取得します。
    デバイスが設定できるとテクスチャ(ayu.jpg) を読み込みます。
        HRESULT InitD3D()
        {
            myd3d= new MyD3D(g_hWnd);
            myd3d->InitD3D(&g_pDEV);
            // テクスチャ読み込み
            g_pTexture= myd3d->LoadTexture(imgfile);
            return S_OK;
        }
        
  7. 描画処理です。
    矩形ポリゴンにテクスチャを設定して DrawPrimitiveUP() でレンダリングします。
        void Draw(void)
        {
            if (!g_pDEV || !g_bActive)  return;
            //黒で塗りつぶして消去
            g_pDEV->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,100,80),1.0f,0);
            if (SUCCEEDED(g_pDEV->BeginScene()))
            {
                // テクスチャ設定
                g_pDEV->SetTexture(0,g_pTexture);
                g_pDEV->SetTextureStageState(0,D3DTSS_COLORARG2,D3DTA_DIFFUSE);
                // 頂点フォーマットの設定
                g_pDEV->SetFVF(FVF_TLVERTEX);
                // 描画処理
                g_pDEV->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,2,vertex,sizeof(TLVERTEX));
                g_pDEV->EndScene();
            }
            g_pDEV->Present(NULL,NULL,NULL,NULL);
        }
        
  8. オブジェクトを開放する関数です。
    取得したオブジェクトは必ず開放して下さい。
        void Cleanup(void)
        {
            SAFE_RELEASE(g_pTexture);
            SAFE_DELETE(myd3d);
        }
        

超初心者の方のために全ソースコードを掲載します。 (^_^;)
全ソースコード

前田稔(Maeda Minoru)の超初心者のプログラム入門

超初心者のプログラム入門(DirectX9 game program)

超初心者のプログラム入門(DirectX10 game program)