Back Buffer を取得して背景画像を表示する

DirectX の BackBuffer を取得して、直接「大・中・小 の画像」を描いた背景をバックにトーラスを回転しながら描画します。
MyD3D Object Class には、画像を入力して簡単に拡大/縮小して描画する関数が用意されています。

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

プログラムの説明

  1. 空の新規プロジェクト(BackTorus)を作成して、次のファイルをプロジェクトのフォルダーに格納して下さい。
    プロジェクト/既存項目の追加からプログラムファイルとヘッダファイルをプロジェクトに追加して下さい。
    myd3d.h と myd3d.cpp は Object Class Library から取得して下さい。
    背景画像はサイズが合った適当な画像を調達してきて下さい。
    ファイル名 ファイルの説明
    baktorus.cpp ソースプログラム
    Emiko_s.bmp 背景画像(320*240)
    myd3d.h MyD3D Object Class ヘッダファイル
    myd3d.cpp MyD3D Object Class プログラムファイル
  2. Global Area と Direct3D Object と Surface の定義です。
    myd3d が MyD3D Object Class の定義です。
    g_pMesh は背景の上から描画するトーラスのメッシュです。
    ViewForm() カメラの座標です。
    ImgFile は背景に表示する画像ファイルです。適当なものを調達してきて下さい。
        #include    "MyD3D.h"
    
        //Global Area
        MyD3D                   *myd3d   = NULL;    // MyD3D Object Class
        HWND                    g_hWnd   = NULL;
        LPDIRECT3DDEVICE9       g_pDEV   = NULL;
        LPD3DXMESH              g_pMesh  = NULL;
        bool                    g_bActive= false;   // アクティブ状態
        D3DXVECTOR3             ViewForm(0.0f,0.0f,200.0f);
        char                    ImgFile[MAX_PATH]= "emiko_s.bmp";
        
  3. WinMain() 関数は何時もと同じです。
  4. Direct Graphics の初期化です。
    Object Class をインスタンス化して、DirectX のインターフェースを取得します。
    トーラスのメッシュを生成します。
    myd3d->LoadImg() で背景に表示する画像を入力します。
    MyD3D Object Class では、3Dと組み合わせた背景画像などを表示するための領域と豊富な関数をサポートします。
        HRESULT InitGraphics(void)
        {
            myd3d= new MyD3D(g_hWnd);
            myd3d->InitD3D(&g_pDEV);
            //トーラスメッシュの生成
            D3DXCreateTorus(g_pDEV,16,40,32,32,&g_pMesh,NULL);
            //Load BMP File
            myd3d->LoadImg(ImgFile);
            return  S_OK;
        }
        
  5. 描画処理のソースコードです。
    GetBackDC() で Back Buffer の HDC を取得して Windows の時と同じように BMP 画像を描画します。
    取得できる Back Buffer の形式には制限があって、全てのマシンで取得できる訳ではありませんが、大抵は大丈夫でしょう。
    BMP 画像を大中小三枚に縮小して、背景として並べています。
    拡大/縮小して描画するときは ShowSize() 関数を使って下さい。
    四番目のパラメータが拡大/縮小の指定です。
    取得した Back Buffer の HDC は ReleaseBackDC(hDC) で開放して下さい。
    背景を描画した上から pMeshApp->DrawSubset(0) でトーラスを回転しながら描画します。
        void Draw(void)
        {   HDC     hDC;
    
            //黒で塗りつぶして消去
            g_pDEV->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0,0,0),1.0f,0);
            //☆Back Surface を取得して直接描画
            hDC= myd3d->GetBackDC();
            if (hDC!=NULL)
            {
                myd3d->Show(hDC,0,20);
                myd3d->ShowSize(hDC,360,50,0.7f);
                myd3d->ShowSize(hDC,640,60,0.5f);
                myd3d->ReleaseBackDC(hDC);
            }
            else    ERMSG("GetBackDC Error");
            if (SUCCEEDED(g_pDEV->BeginScene()))
            {   g_pDEV->BeginScene();
                //描画環境の設定
                SetupMatrices();
                g_pMesh->DrawSubset(0);
                g_pDEV->EndScene();
            }
            g_pDEV->Present(NULL,NULL,NULL,NULL);
        }
        
  6. 描画環境を設定する関数です。
    View 座標をY軸を中心にして回転しています。
        void  SetupMatrices(void)
        {   RECT            rect;
            D3DXMATRIX      matView;
            D3DXMATRIX      matProj;
            D3DXVECTOR3     VF;
    
            GetClientRect(g_hWnd,&rect);
            //View 座標をY軸を中心にして自動回転
            VF= ViewForm;
            myd3d->Rotate(&VF,&D3DXVECTOR3(0.0f,0.0f,0.0f),timeGetTime()/50.0f,1);
            //View 座標の設定
            D3DXMatrixLookAtLH(&matView,&VF,&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,100,1000);
            g_pDEV->SetTransform(D3DTS_PROJECTION,&matProj);
            //Material と Light の設定
            myd3d->SetMaterial(0.8f,0.7f,0.0f);
            myd3d->SetLight();
        }
        

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

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

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

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