メルマガ:あゆしゃのC言語プログラミング
タイトル:あゆしゃのC言語プログラミング(Vol.626) DX12 描画処理  2005/12/21


/*========================================================*/
    <<<あゆしゃのC言語プログラミング>>>
/*========================================================*/
 第626回 DX12 描画処理
 発行    2005年12月21日(水曜日)
 発行数   約2500

{magclick}
/*========================================================*/
 はじめに ( 決り文句 )
/*========================================================*/
・このメールマガジンは、主にまぐまぐさんから発行しています。
・ジャンルは、マルチメディアのプログラム、C言語です。
・横60文字で作成し、インデントは大抵半角スペース4つです。
・ここで扱うプログラムは、C言語と半光年以内のものです。
・登録解除は、メルマガのホームページでお願いします。
・過去ログはバックナンバー(下欄参照)を活用して下さい。
・内容は私が感じたもので、最新の技術も、へたれもあります。
・わかりやすさを優先させる為、たまに嘘があるかもしれません。

/*========================================================*/
 ご挨拶
/*========================================================*/

 こんにちは。あゆしゃです。

 というわけで、ようやくバイハザをクリアできました。

 20時間ほどかかってしまいました。

★アマレベルなのに。。

 そして現在は4週目。

 もうなれたもので、3時間ほどでクリアできますから、

 走馬灯のようにフィールドを駆け回っています。

★無限ロケットランチャーを振り回して。

{magclick}
/*========================================================*/
 今回のお題  << DX12 描画処理 >>
/*========================================================*/

 サンプルソースです。

http://ayusya.hp.infoseek.co.jp/Source/DX9Sample_051216.cpp

 その実行結果です。

http://ayusya.hp.infoseek.co.jp/Image/DirectXSample_051205.png

/*========================================================*/

 今回は一番楽しい、描画処理です。

// 描画処理(再描画するときはここを再実行する)
if( pD3D && pDev && pMesh )
{
    // 背景を青で塗りつぶす
    pDev->Clear( 0, NULL,
        D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
        D3DCOLOR_XRGB( 0, 0, 255 ), 1.0, 0 );
    if( SUCCEEDED( pDev->BeginScene() ) )
    {
        // 描画設定
        pDev->SetMaterial( &Material );
        pMesh->DrawSubset( 0 ); // 0番のポリゴン集合を描画
        pDev->EndScene();
    }
    pDev->Present( NULL, NULL, NULL, NULL ); // 全体を全体に
}

 こんな感じですね。

/*========================================================*/

 最初のif文は、処理を実行できることを確認しています。

 通常は実行されます。

/*========================================================*/

 背景色はとりあえず、

    // 背景を青で塗りつぶす
    pDev->Clear( 0, NULL,
        D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
        D3DCOLOR_XRGB( 0, 0, 255 ), 1.0, 0 );

 これで塗りつぶすことができるということです。

 第2引き数にはクリアする領域を配列で指定します。

 NULLを指定すると画面全体となります。

 クリアしないと、デフォルトではごみが出るので、少なくとも
最初に全体をクリアしておきます。

 第1引き数にはクリアする領域の数を指定します。

 NULLを指定する場合は0となります。

        D3DRECT r;
        r.x1 = 0;
        r.y1 = 0;
        r.x2 = 500;
        r.y2 = 400;
        pDev->Clear( 1, &r,
            D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
            D3DCOLOR_XRGB( 0, 0, 255 ), 1.0, 0 );

 このようにすれば、単純矩形塗りつぶしとなります。

/*========================================================*/

 続いて、メッシュを描画します。

    if( SUCCEEDED( pDev->BeginScene() ) )
    {
        // 描画設定
        pDev->SetMaterial( &Material );
        pMesh->DrawSubset( 0 ); // 0番のポリゴン集合を描画
        pDev->EndScene();
    }

 シーンというものを作成し、BeginScene と EndScene の間で
メッシュの描画を行うらしいですよ。

 まずはデバイスにマテリアルを指定し、

 そのマテリアルを適用するポリゴンのみを描画します。

 DrawSubset がメッシュを描画します。

 このときに指定する値は、メッシュの設定に指定した
属性番号です。

 指定した属性番号に属するポリゴンだけが描画されます。

 今回は1つだけですが、これをマテリアルの数だけ行います。

 一通り描画し終わったら、EndScene でシーンを終了します。

/*========================================================*/

 最後に、描画した結果を画面に出力します。

    pDev->Present( NULL, NULL, NULL, NULL ); // 全体を全体に

 第1引き数は描画結果のどこを使用するかという、転送元領域
です。

 NULLをしていすれば、全体となります。

 第2引き数はどこに出力するかという、転送先領域です。
 ディスプレイ座標を指定できます。

RECT r2;
r2.left = 100;
r2.right = 200;
r2.top = 100;
r2.bottom = 400;
pDev->Present( NULL, &r2, NULL, NULL );
r2.left = 300;
r2.right = 600;
r2.top = 100;
r2.bottom = 300;
pDev->Present( NULL, &r2, NULL, NULL );

 このように指定すれば、このように表示されいます。

http://ayusya.hp.infoseek.co.jp/Image/DirectXSample_051221.png

 1つの画面に複数のシーンを貼り付けることができます。

 ただし、ちらつくので重ねることはできません。

 第3引き数は出力先のHWNDですが、すでにデバイスに登録済み
なので、NULLで省略します。個別に指定することもできます。

 第4引き数はスワップというエフェクトをかけるための
リージョン(領域)座標らしいですが、良くわかりません。

/*========================================================*/

 最後に、メッシュ、デバイス、そしてDirectX3Dオブジェクトを
削除して、プログラムが終了します。

if( pMesh ) pMesh->Release();
if( pDev ) pDev->Release();
if( pD3D ) pD3D->Release();

 今回は単独処理なのでここにありますが、本来はソフトが終了
する時点で行います。

{magclick}
/*========================================================*/
 さいごに
/*========================================================*/

 今後の予定です。

12月16日金曜日 第624回 DX10 マテリアルの設定 済
12月19日月曜日 第625回 DX11 メッシュの設定 済
12月21日水曜日 第626回 DX12 描画処理 済
12月23日金曜日 第627回 2005年総集編
 1月 9日月曜日 第628回 2006年
 1月11日水曜日 第629回 DX13 マップを描画

{magclick}
/*========================================================*/
 次回予告
/*========================================================*/

 次回は12月23日(金曜日)に、第627回をお送りします。
 お題は「2005年総集編」

 今年一年、ご購読ありがとうございました。

 お楽しみに!

/*========================================================*/
 最後の決り文句
/*========================================================*/
 このメールマガジンは、まぐまぐさんから発行しています。
 このメールマガジンを解除したい場合は、まぐまぐさんをご利用
ください。このメルマガのまぐまぐアイディーは最後にあります。
 このメールマガジンには広告が挿入されていますか?
 このメールマガジンの内容に文面の引用はありませんか?
 めーらっくすの場合はめーらっくすの利用方に従ってください。
 このメールマガジンの内容の、転用、流用、宣伝、リンク、
攻殻と違って自爆しないのがいいです なんて大歓迎です。

{magclick}
/*========================================================*/
 
/*========================================================*/

発行者 あゆしゃ

ホームページ::あゆしゃの世界
http://ayusya.hp.infoseek.co.jp/

ご意見・ご感想・ご質問メール
mailto:ayusya@flamenco.plala.or.jp

まぐまぐ::アイディー
0000020674

まぐまぐ::登録と解除
http://www.mag2.com/m/0000020674.htm

まぐまぐ::バックナンバー
http://jazz.tegami.com/backnumber/frame.cgi?id=0000020674

めーらっくす::アイディー
MM3E1AEE285AB4F

めーらっくす::登録と解除
http://www.mailux.com/mm_dsp.php?mm_id=MM3E1AEE285AB4F

めーらっくす::バックナンバー★最近のものならこちらが便利★
http://www.mailux.com/mm_bno_list.php?mm_id=MM3E1AEE285AB4F

ブラウザの閉じるボタンで閉じてください。