虎のモデルを描画する

DirectX でテクスチャを貼り付けた虎のモデルを回転しながら描画します。

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

プロジェクトの説明

  1. Common のフォルダーと相対的な位置関係にある場所に、フォルダーを作成して下さい。
    詳細は TEXT を表示する を参照して下さい。
    フォルダーに tiger.x と tiger.bmp を格納して下さい。
  2. g_Mesh が Tiger Mesh の定義です。
    g_Camera はカメラの Object 定義です。
    g_matObj には回転座標を設定します。
    Mesh_File[MAX_PATH] が入力するメッシュファイルの名前です。
    CALLBACK 関数は、アプリケーションで必要な関数だけを宣言しています。
        /*****************************************************/
        /*  Mesh(tiger.x) を回転しながら描画する    前田 稔  */
        /*****************************************************/
        #include "dxstdafx.h"
        #include <commdlg.h>
        #include "resource.h"
    
        // Global variables
        CDXUTMesh           g_Mesh;                 // Tiger Mesh
        CFirstPersonCamera  g_Camera;               // A model viewing camera
        D3DXMATRIXA16       g_matObj;               // World Matrix
        WCHAR               Mesh_File[MAX_PATH]= L"tiger.x";
    
        // Forward declarations 
        HRESULT CALLBACK OnCreateDevice( IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext );
        HRESULT CALLBACK OnResetDevice( IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext );
        void    CALLBACK OnFrameMove( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext );
        void    CALLBACK OnFrameRender( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext );
        void    CALLBACK OnLostDevice( void* pUserContext );
        void    CALLBACK OnDestroyDevice( void* pUserContext );
        
  3. WinMain で CALLBACK 関数を設定します。
    DXUTMainLoop() でメッセージループに入ります。
  4. DirectX の主要な処理は CALLBACK 関数で行います。
    OnCreateDevice() で tiger.x を入力してメッシュを生成します。
        HRESULT CALLBACK OnCreateDevice( IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext )
        {
            HRESULT hr;
    
            //V_RETURN( g_Mesh.Create( pd3dDevice, L"tiger.x" ) );
            V_RETURN(g_Mesh.Create(pd3dDevice, Mesh_File));
    
            return S_OK;
        }
        
  5. OnResetDevice() で描画環境の設定を行います。
    tiger mesh のレンダリングでは、光源を使いません。
        HRESULT CALLBACK OnResetDevice( IDirect3DDevice9* pd3dDevice, 
                                        const D3DSURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext )
        {
            // Set the transform matrices
            D3DXMATRIXA16  matWorld;
            D3DXMatrixIdentity( &matWorld );
            pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );
    
            // Setup the camera with view & projection matrix
            D3DXVECTOR3 vecEye(0.0f, 0.0f, -5.0f);
            D3DXVECTOR3 vecAt (0.0f, 0.0f, 0.0f);
            g_Camera.SetViewParams( &vecEye, &vecAt );
            float fAspectRatio = pBackBufferSurfaceDesc->Width / (FLOAT)pBackBufferSurfaceDesc->Height;
            g_Camera.SetProjParams( D3DX_PI/4, fAspectRatio, 1.0f, 1000.0f );
    
            g_Mesh.RestoreDeviceObjects( pd3dDevice );
    
            return S_OK;
        }
        
  6. Rendering を行う CALLBACK 関数です。
    View 座標と Proj を設定して、WORLD 座標を回転しながら描画します。
    D3DRS_LIGHTING,FALSE で「ライティングしない」に設定して描画します。
        void CALLBACK OnFrameRender( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext )
        {
            HRESULT hr;
    
            D3DXMATRIXA16 matView = *g_Camera.GetViewMatrix();
            D3DXMATRIXA16 matProj = *g_Camera.GetProjMatrix();
    
            pd3dDevice->SetTransform( D3DTS_VIEW,       &matView );
            pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );
    
            pd3dDevice->Clear( 0L, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0x00004060, 1.0f, 0L );
    
            if( SUCCEEDED( pd3dDevice->BeginScene() ) )
            {
                pd3dDevice->SetRenderState(D3DRS_LIGHTING,FALSE);   //ライティングしない
                pd3dDevice->SetTransform( D3DTS_WORLD, &g_matObj );
                V( g_Mesh.Render( pd3dDevice ) );
                DXUT_EndPerfEvent(); // end of demonstration code
    
                pd3dDevice->EndScene();
            }
        }
        
  7. OnLostDevice() で Tiger のメッシュを無効にします。
        void CALLBACK OnLostDevice( void* pUserContext )
        {
            g_Mesh.InvalidateDeviceObjects();
        }
        
  8. OnDestroyDevice() で Tiger のメッシュを開放します。
        void CALLBACK OnDestroyDevice( void* pUserContext )
        {
            g_Mesh.Destroy();
    
        }
        

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

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

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

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