01−02、main


読み込みと描画呼び出し

プログラムのメイン部分はRDBMain.cppにあります。
01章の段階でのRDBMain.cppは、ほとんどDirectX SDKのBasicHLSLそのままです。

DXUTがたくさん出てきますが、ほとんど触れずに進めます。
DXUTで変更した部分はDXUTFindDXSDKMediaFileCch関数のみです。
親フォルダのMediaフォルダを検索するようにしました。

mainでする主なことはオブジェクトの作成、破棄、ロード、描画です。

ここでは処理の詳細については説明せずに
どういう命令を呼び出しているかという流れだけを見てみます。


まずオブジェクトの作成とロードを見てみます。

g_model = new CModel();
if( !g_model ){
    _ASSERT( 0 );
    return 1;
}
CallF( g_model->LoadMQO( pd3dDevice, L"poo\\poo_nobone.mqo" ), return 1 );

OnCreateDevice関数内で上記のモデルの作成とロードを行っています。

WCHAR str[MAX_PATH];
V_RETURN( DXUTFindDXSDKMediaFileCch( str, MAX_PATH, L"Shader\\Ochakko.fx" ) );
V_RETURN( D3DXCreateEffectFromFile( pd3dDevice, str, NULL, NULL, dwShaderFlags,
    NULL, &g_pEffect, NULL ) );

上記はシェーダーのロードです。同じくOnCreateDevice内で呼び出しています。

描画部分は以下のようになります。

HRESULT hr;
D3DXMATRIXA16 mView;
D3DXMATRIXA16 mProj;

V( pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
    D3DXCOLOR( 0.0f, 0.25f, 0.25f, 0.55f ), 1.0f, 0 ) );

if( SUCCEEDED( pd3dDevice->BeginScene() ) )
{
    mProj = *g_Camera.GetProjMatrix();
    mView = *g_Camera.GetViewMatrix();

    D3DXMATRIXA16 mtempW, mW, mWVP;
    int xindex, zindex;
    float xpos, zpos;
    for( zindex = 0; zindex < 5; zindex++ ){
        zpos = zindex * 200.0f;
        for( xindex = 0; xindex < 10; xindex++ ){
            xpos = ( xindex - 5 ) * 30.0f;
            D3DXMatrixTranslation( &mtempW, xpos, 0.0f, zpos );
            mW = g_mCenterWorld * mtempW * *g_Camera.GetWorldMatrix();
            mWVP = mW * mView * mProj;

            V( g_pEffect->SetMatrix( g_hmWVP, &mWVP ) );
            V( g_pEffect->SetMatrix( g_hmWorld, &mW ) );

            g_model->OnRender();
        }
    }

    V( pd3dDevice->EndScene() );
}

なんかごちゃごちゃありますが、難しいことはしていません。
描画部分をBeginSceneとEndSceneでサンドイッチします。
キャラクターを横に10体並べたものを5列描画しています。
並べるためにworld座標をずらしていって変換行列を計算し、SetMatrixでシェーダーに転送し
g_model->OnRenderでキャラクターを描画します。


01章のトップに戻る

オープンソースのトップに戻る

トップページに戻る