DirectX9 プログラミングメモ

Menu

チュートリアル

  1. 空のウインドウを表示する
  2. フルスクリーンとウインドウモードを切り替える
  3. マウスカーソルを消す
  4. 文字を描画する
  5. 2Dテクスチャを描画する
  6. カーソルキーの取得
  7. MIDI,WAVEの再生
  8. 三角形を描画する
  9. 四角ポリゴンの描画とテクスチャ設定
  10. 行列変換
  11. Xファイルの読み込みと表示
  12. 座標指定と複数メッシュの表示
  13. カメラの回転
  14. メッシュの拡大縮小
  15. ズームイン・アウト
  16. 指定座標で円運動
  17. ビルボード
  18. スキンメッシュアニメーション
  19. 頂点シェーダー
  20. ピクセルシェーダー
  21. HLSL
  22. HLSL:環境光
  23. HLSL:ランバート拡散照明
  24. HLSL:フォン鏡面反射
  25. HLSL:クック・トランス金属反射
  26. HLSL:カラーシフト


  1. 衝突判定:バウンディングスフィア
  2. 衝突判定:バウンディングボックスAABB
  3. 衝突判定:バウンディングスフィアOBB
  4. 衝突判定:レイ



更新履歴

三角形を描画する

三角形を描画します。
なぜ三角形なのか?というのもDirectXの描画のほとんどは内部で三角ポリゴンを使っているからです。
全ての基本という事になります。

#include <d3d9.h>
#include <d3dx9.h>

#define SAFE_RELEASE(p) {if(p){(p)->Release();(p)=NULL;}}//安全に解放する

LPDIRECT3D9             g_pD3D       = NULL;//Direct3D9
LPDIRECT3DDEVICE9       g_pd3dDevice = NULL;//レンダリングデバイス
LPD3DXFONT    g_pFont   = NULL; //フォント
LPDIRECT3DVERTEXBUFFER9 g_pVB        = NULL;//頂点バッファ

//頂点構造体
struct CUSTOMVERTEX
{
    FLOAT x, y, z, rhw; //各座標,wの逆数
    DWORD color;        //頂点カラー
};
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)


//Direct3D初期化
HRESULT InitD3D( HWND hWnd )
{
    //Direct3Dを生成する
 if(NULL==(g_pD3D=Direct3DCreate9(D3D_SDK_VERSION))){return E_FAIL;}

    //デバイス生成用のパラメーター
    D3DPRESENT_PARAMETERS d3dpp;//パラメーター構造体
    ZeroMemory( &d3dpp, sizeof(d3dpp) );//ゼロで初期化
    d3dpp.Windowed = TRUE;//ウインドウモードで起動
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;//バックバッファのスワップエフェクト Direct3Dにスワップエフェクトをまかせる
    d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;//バックバッファのフォーマット 今表示されているモニタの設定と同じ
    d3dpp.BackBufferCount = 1;//バックバッファの数
    d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;//マルチサンプリングは行わない
    d3dpp.MultiSampleQuality = 0;//マルチサンプリングは行わないので0
    //d3dpp.EnableAutoDepthStencil = TRUE;//Direct3Dに深度バッファの管理をまかせる
    d3dpp.AutoDepthStencilFormat = D3DFMT_D16;//深度バッファのフォーマット(通常はこの値で問題ない)
    d3dpp.hDeviceWindow = hWnd;//カバーウィンドウ=アプリケーションのウィンドウ
    d3dpp.Flags = 0;//フラグは使わない
    d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;//今のリフレッシュレートをそのまま使う
    d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT;//モニタの垂直回帰を待つ

    //Direct3Dデバイスの生成 HAL(ハードウェアアクセラレーション)
    if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, &g_pd3dDevice))){
  //HALが駄目ならHEL(ソフトウェアエミュレーション)
        if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_pd3dDevice))){
   //駄目なら終了
   return(E_FAIL);
        }
    }
    return S_OK;
}

//頂点バッファの初期化
HRESULT InitVB()
{
    //頂点データのセット
    CUSTOMVERTEX Vertices[] =
    {
        { 320.0f,  50.0f, 0.5f, 1.0f, 0xffffff00, }, // x, y, z, rhw, color
        { 590.0f, 430.0f, 0.5f, 1.0f, 0xffffff00, },
        {  50.0f, 430.0f, 0.5f, 1.0f, 0xffffff00, },
    };

 //頂点バッファの生成
    if( FAILED( g_pd3dDevice->CreateVertexBuffer( 3*sizeof(CUSTOMVERTEX),0, D3DFVF_CUSTOMVERTEX,
                            D3DPOOL_DEFAULT, &g_pVB, NULL ))){return E_FAIL;}

    //デバイスメモリーに書き込むためにロックする
    VOID* pVertices;//デバイスメモリー用
 if( FAILED(g_pVB->Lock(0,sizeof(Vertices),(void**)&pVertices,0))){return E_FAIL;}//pVerticesを頂点バッファのデバイスメモリーにする
    memcpy( pVertices, Vertices, sizeof(Vertices) );//頂点データをコピー
    g_pVB->Unlock();//ロック解除

    return S_OK;
}

//フォントの初期化
HRESULT InitFont(HWND hWnd)
{
 //フォントの生成 MSゴシック
 //デバイス,文字高さ,文字幅,フォントスタイル,ミップマップのレベル,斜体にするかどうか,文字セット,出力精度,出力品質,フォントピッチとファミリ,フォント名,フォントポインタ
 HRESULT hr = D3DXCreateFont( g_pd3dDevice, 24, 0, FW_HEAVY, 1, false, SHIFTJIS_CHARSET, OUT_TT_ONLY_PRECIS,
  ANTIALIASED_QUALITY, FF_DONTCARE, L"MS ゴシック", &g_pFont );
 if FAILED(hr){return(E_FAIL);}
 return S_OK;
}

//終了時解放処理
VOID Cleanup()
{
 SAFE_RELEASE(g_pVB);
 SAFE_RELEASE(g_pFont);
    SAFE_RELEASE(g_pd3dDevice);
    SAFE_RELEASE(g_pD3D);
}

//レンダリング
VOID Render()
{
 //デバイスが無いなら終了
 if(NULL==g_pd3dDevice){return;}

    //バックバッファのクリア
    g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,150, 255), 1.0f, 0 );
   
    //シーンの開始
    if(SUCCEEDED(g_pd3dDevice->BeginScene()))
    {
        //ここに処理内容を書く
  RECT rect;
  SetRect(&rect,0,0,50,50);//描画位置
  //スプライトポインタ(無くても良し),描画文字,文字数(-1で全部),描画範囲,フォーマット,色
  g_pFont->DrawText(NULL, L"三角形の描画", -1, &rect, DT_LEFT | DT_NOCLIP, D3DCOLOR_ARGB(255, 0, 0, 0));
  //ストリームソースのセット
  g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEX) );
  //FVFのセット
  g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
  //三角形描画
  g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 1 );

   
        //シーンの終了
        g_pd3dDevice->EndScene();
    }

    //バックバッファを表画面に反映させる
    g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
}

//メッセージプロシージャ
LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
    switch( msg )
    {
        case WM_DESTROY://終了時
            Cleanup();
            PostQuitMessage(0);
            return 0;

        case WM_PAINT://ウインドウ描画時
            Render();
            return 0;
  case WM_SIZE://ウインドウサイズ変更時
   InvalidateRect(hWnd,NULL,true);//画面更新
   return 0;
    }

    return DefWindowProc( hWnd, msg, wParam, lParam );
}

//メイン関数
INT WINAPI wWinMain( HINSTANCE hInst, HINSTANCE, LPWSTR, INT )
{
    //ウインドウクラスの登録
    WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
                      GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
                      L"Window1", NULL };
    RegisterClassEx( &wc );

 //タイトルバーとウインドウ枠の分を含めてウインドウサイズを設定
 RECT rect;
 SetRect(&rect,0,0,640,480);
 AdjustWindowRect(&rect, WS_OVERLAPPEDWINDOW, FALSE);
 rect.right=rect.right-rect.left;
 rect.bottom=rect.bottom-rect.top;
 rect.top=0;
 rect.left=0;

    //ウインドウの生成
    HWND hWnd = CreateWindow( L"Window1", L"Hello DirectX9 World !!",
    WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, rect.right, rect.bottom,
                              NULL, NULL, wc.hInstance, NULL );

    //Direct3D初期化
    if(SUCCEEDED(InitD3D(hWnd)))
    {
  InitFont(hWnd);
  InitVB();
        //ウインドウ表示
        ShowWindow(hWnd,SW_SHOWDEFAULT);
        UpdateWindow(hWnd);

        //メッセージループ
        MSG msg;
        while( GetMessage(&msg,NULL,0,0))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }

    UnregisterClass(L"Window1",wc.hInstance);
    return 0;
}


添付ファイル