矩形にあゆのテクスチャを貼り付ける

浜崎あゆみの画像を次の二通りの方法で貼り付けます。
1.一個の矩形(二個の三角形)に、あゆの画像を「二列、三行」で貼り付けます。
2,一枚の画像を二個の矩形(四個の三角形)をまたいで、一枚の写真のように貼り付けます。
カリングと座標系の説明は Windows Guid を参照して下さい。

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

プログラムの説明

  1. #include と #pragma と Direct3D の領域です。
    myd3d は MyD3D Object Class の定義です。
    g_pTexture はテクスチャのオブジェクトです。
    ViewForm() はカメラの座標です。
        //Global Area
        MyD3D                   *myd3d     = NULL;
        HWND                    g_hWnd     = NULL;
        LPDIRECT3DDEVICE9       g_pDEV     = NULL;
        LPDIRECT3DTEXTURE9      g_pTexture = NULL;
        bool                    g_bActive  = false;
        D3DXVECTOR3             ViewForm(0.0f, 0.0f, -5.0f);
        char                    imgfile[]= "c:\\data\\test\\ayu.jpg";
        
  2. 頂点フォーマットの設定です。
    三角形を組み合わせた矩形を定義します。
    tu,tv がテクスチャ座標の定義です。
    vtx1[] は左側の画像で、横方向に二枚、縦方向に三枚のテクスチャをタイルのように貼り付けます。
    1.0 を超えたテクスチャ座標を設定すると、規定値ではテクスチャが繰り返されます。
    範囲外の値を設定したときの効果(アドレス・モード)はプログラムで変更することもできます。
    vtx2[] は右側の画像で、テクスチャを左半分と右半分に分けて貼り付けます。
    0.5f がテクスチャの真ん中で、左右に分かれていることに注目して下さい。
        #define D3DFVF_VERTEX (D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1)
        typedef struct _D3DLVERTEX_
        {   float       x,y,z;    // The position
            D3DCOLOR    color;    // The color
            FLOAT       tu, tv;   // The texture coordinates
        }   D3DMYVERTEX;
    
        //四角形の定義
        //一個の矩形に6枚貼り付け
        D3DMYVERTEX vtx1[]=
        {
            { -2.2f,  1.0f,  0.0f,  0xffffffff, 0.0f,  0.0f  },    //左上
            { -0.2f,  1.0f,  0.0f,  0xffffffff, 2.0f,  0.0f  },    //右上
            { -2.2f, -1.0f,  0.0f,  0xffffffff, 0.0f,  3.0f  },    //左下
            { -0.2f, -1.0f,  0.0f,  0xffffffff, 2.0f,  3.0f  },    //右下
        };
    
        //三個の矩形に1枚貼り付け
        D3DMYVERTEX vtx2[]=
        {
            {  2.0f,  1.0f,  0.0f,  0xffffffff, 1.0f, 0.0f  },    //右上
            {  2.0f, -1.0f,  0.0f,  0xffffffff, 1.0f, 1.0f  },    //右下
            {  1.0f,  1.0f,  0.0f,  0xffffffff, 0.5f, 0.0f  },    //中上
            {  1.0f, -1.0f,  0.0f,  0xffffffff, 0.5f, 1.0f  },    //中下
            {  0.0f,  1.0f,  0.0f,  0xffffffff, 0.0f, 0.0f  },    //左上
            {  0.0f, -1.0f,  0.0f,  0xffffffff, 0.0f, 1.0f  },    //左下
        };
        
  3. WinMain() はいつもと同じです。
    描画は WM_PAINT: から Draw() 関数で行います。
        int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int)
        {   MSG     msg;
                    :
                    :
            if (!g_hWnd)            return FALSE;
            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);
                }
            }
        
  4. CALLBACK 関数はいつもと同じです。
    ESCAPEキーまたは F12キーを押すと終了して下さい。
    今回のような静止した画像は Windows と同じように WM_PAINT: で描画することができます。
        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 0;
                case WM_KEYDOWN:
                    switch(wParam)
                    {   case VK_ESCAPE:
                        case VK_F12:
                            PostMessage(hWnd,WM_CLOSE,0,0);
                            return 0L;
                    }
                    break;
                case WM_DESTROY:
                    PostQuitMessage(0);
                    return 0L;
            }
            return DefWindowProc(hWnd,msg,wParam,lParam);
        }
        
  5. MyD3D Object Class をインスタンス化して、インターフェースを取得します。
    デバイスが設定できるとテクスチャ読み込みます。
        //デバイス/モード等の初期化
        HRESULT InitD3D()
        {
            myd3d= new MyD3D(g_hWnd);
            myd3d->InitD3D(&g_pDEV);
            // テクスチャ読み込み
            g_pTexture= myd3d->LoadTexture(imgfile);
            return S_OK;
        }
        
  6. 描画処理です。
    SetupMatrices() で描画環境を設定してレンダリングします。
    vtx1 が左側の矩形で、vtx2 が右側の矩形です。
        void Draw(void)
        {
            if (!g_pDEV || !g_bActive)  return;
            g_pDEV->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,60,80),1.0,0);
            if (SUCCEEDED(g_pDEV->BeginScene()))
            {   SetupMatrices();
                //頂点フォーマットの設定
                g_pDEV->SetFVF(D3DFVF_VERTEX);
                // 描画処理
                g_pDEV->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,2,vtx1,sizeof(D3DMYVERTEX));
                g_pDEV->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,4,vtx2,sizeof(D3DMYVERTEX));
                g_pDEV->EndScene();
            }
            g_pDEV->Present(NULL,NULL,NULL,NULL);
        }
        
  7. 描画環境の設定です。
        void  SetupMatrices(void)
        {   D3DXMATRIX      matView;
            D3DXMATRIX      matProj;
            RECT            rect;
    
            GetClientRect(g_hWnd,&rect);
            //View 座標の設定
            D3DXMatrixLookAtLH(&matView,&ViewForm,
                               &D3DXVECTOR3(0.0f,0.0f,0.0f),&D3DXVECTOR3(0.0f,1.0f,0.0f));
            g_pDEV->SetTransform(D3DTS_VIEW,&matView);
            //透視変換の設定
            D3DXMatrixPerspectiveFovLH(&matProj,D3DXToRadian(45.0f),(float)rect.right/(float)rect.bottom,1,50);
            g_pDEV->SetTransform(D3DTS_PROJECTION,&matProj);
            //Zバッファの設定
            g_pDEV->SetRenderState(D3DRS_ZENABLE,D3DZB_FALSE);
            g_pDEV->SetRenderState(D3DRS_LIGHTING,FALSE);
            g_pDEV->SetTexture(0,g_pTexture);
            g_pDEV->SetTextureStageState(0,D3DTSS_COLOROP,  D3DTOP_MODULATE);
            g_pDEV->SetTextureStageState(0,D3DTSS_COLORARG1,D3DTA_TEXTURE);
            g_pDEV->SetTextureStageState(0,D3DTSS_COLORARG2,D3DTA_DIFFUSE);
        }
        
  8. オブジェクトを開放する関数です。
    取得したオブジェクトは必ず開放して下さい。
        void Cleanup(void)
        {
            SAFE_RELEASE(g_pTexture);
            SAFE_DELETE(myd3d);
        }
        

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

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

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