読者です 読者をやめる 読者になる 読者になる

IDirect3DDevice9::DrawPrimitiveUp

DirectX Sample

DirectX8からDirectXGraphicsになり、DirectDrawは互換性のために残されるだけで、以降は2DでもDirect3Dを使うのが主流となった・・・。
DXSDK_Feb10.exeでは(というかそれ以前からだが)、Direct3Dについては9以降のものしか用意されてないので、以降はDirect3D9について扱っていく・・・。

今回は、Direct3Dで2Dの板ポリゴンとして、画像を描画する・・・。

プロジェクト作成、ソースコードを追加したら、

f:id:BG1:20160812220402p:plain

d3d9.lib、d3dx9.lib、dxguid.libをリンク・・・。

test.bmpもプロジェクトファイルのところに置いておく・・・。(test2.bmpは今回使わない・・・。)

d3d9.hとd3dx9.hをインクルード・・・。
d3d9.hとd3d9.libは、Direct3D9本体・・・。
d3dx9.hとd3dx9.libは、Direct3DX9というユーティリティライブラリ・・・。

Direct3Dの今回のプロジェクトに必要な変数の宣言・・・。
まあ、追々説明・・・。

Direct3Dオブジェクトの作成・・・。

現在のディスプレイモードが後々必要なので、取得しておく・・・。

さらにDirect3Dバイスオブジェクトというのを取得したいのだが、それに必要なプレゼンテーションパラメータというのを設定しないといけない・・・。
で、d3dpp.BackBufferFormatに、先ほどのディスプレイモードd3ddmのFormat渡している・・・。
d3dpp.WindowedがFALSEなので今回もフルスクリーン・・・。

Direct3Dバイスオブジェクトの生成は、描画と頂点処理をハードウェアで行う方法、描画をハードウェアで頂点処理はCPUで行う方法、描画と頂点処理をCPUで行う方法、の順で試していく・・・。
(この辺はPCの構成によっても違う・・・。ちなみにWin7VM環境では最後の方法で生成された・・・。)

D3DXCreateTextureFromFileは画像からテクスチャを作成するユーティリティ関数・・・。
これで"test.bmp"からテクスチャ作成・・・。

ポリゴンはいくつかの頂点にテクスチャを貼ることで成り立つ・・・。

頂点Vertex構造体の定義・・・。

頂点4つを設定・・・。
Direct3Dは基本的に頂点3つで三角形を作ることしかできない・・・。
しかし4つ目の頂点を三角形と逆回りの位置に置くことで2つの三角形ができ、矩形となる・・・。
こういうのをスプライトという・・・。
(頂点の順番や仕組みなどについて細かいところは難しいのでここでは説明しない・・・。)

これで下準備はできたので、ループ処理・・・。

lpD3DDevice->BeginSceneで描画開始・・・。EndSceneまでバックバッファに描画される・・・。
lpD3DDevice->Clearでまずは背景をクリアに・・・。
lpD3DDevice->SetTextureでデバイスオブジェクトに先ほどのテクスチャをセット・・・。
lpD3DDevice->SetFVFで頂点フォーマット(先ほどのVertexの形式)をデバイスオブジェクトに伝達・・・。
lpD3DDevice->DrawPrimitiveUPでvertexで定義された頂点を描画・・・。ここに先ほどのテクスチャが貼り付けられる・・・。

IDirect3DDevice9::DrawPrimitiveUP method (Windows)

lpD3DDevice->EndSceneで描画終了・・・。
lpD3DDevice->Presentでプライマリーバッファへ転送・・・。

SAFE_RELEASEで解放処理・・・。

これで、

f:id:BG1:20160812225556p:plain

フルスクリーンでこれが描画された・・・。
(スクショ撮ったらIMEが出てしまったけども・・・。)
Direct3D、ホント難しい・・・。
頂点の説明とかもいろんなところで説明が違ってて、どこがあってるんだか・・・。
誰か詳しい人教えて・・・。

Sample/dx/IDirect3DDevice9/DrawPrimitiveUp/src/IDirect3DDevice9 at master · bg1bgst333/Sample · GitHub