あかすくぱるふぇ

同人サークル「あかすくぱるふぇ」のブログです。

DirectX

DirectXだけでなく、OpenGLでも同じだと思いますが。

・ウィンドウサイズ
CreateWindow()においてピクセル単位で指定する。

・バックバッファサイズ
CreateDevice()の引数であるD3DPRESENT_PARAMETERSのBackBufferWidthとBackBufferHeightで指定する。
ウィンドウサイズと同じにしないと、後述するビューポートの設定で混乱する。

・ビューポート
バックバッファ中の描画対象領域を指定する。
ウィンドウサイズとバックバッファサイズが同じであれば、ピクセル単位で設定すればよい。
ビューポートをいじっても描画内容自体は変わらない。指定されなかった領域に描画されないだけ。

・トランスフォーム済み頂点(D3DFVF_XYZRHW)
2D描画の場合は、トランスフォーム済み頂点(D3DFVF_XYZRHW)を用いる。
これで、頂点座標がトランスフォーム済み(スクリーン座標)として扱われる。

・UV座標
テクスチャのうち描画する領域を指定。
左上が(0,0)、右下が(1,1)。

・ポリゴン頂点座標
指定した大きさのポリゴン全体に、UV座標で指定した領域のテクスチャが貼られる。
トランスフォーム済みなので、ポリゴンの大きさ=バックバッファに描かれるテクスチャの大きさとなる。
バックバッファ(ビューポート)よりポリゴンが大きいこともあり得る。
その場合は(当然の帰結として)テクスチャの一部が描画されることになる。

DIrectX9のテクスチャはLockRectにより上書きできる。
このことはググればすぐに出てくるが、読む方についてはあまり見当たらず、つまづいたのでメモ。

・書き込み
pTexture->LockRect(0, &d3dLRect, 0, D3DLOCK_DISCARD);

・読み込み
pTexture->LockRect(0, &d3dLRect, 0, D3DLOCK_READONLY);

D3DLOCK_DISCARDは上書きモードなので、読む時はD3DLOCK_READONLYを指定する必要がある。

D3DXCreateTextureの引数とLockRect, SetRenderTargetの成否との関係について記します。
想定しているのは下図のような状況。
無題
・関数の説明
- D3DXCreateTexure
テクスチャを生成する関数。引数としてUsageとD3DFORMATを与える。

- LockRect
テクスチャのデータを読み書きするための関数。

- SetRenderTarget
レンダーターゲットを設定する関数。

・D3DXCreateTextureの引数
- Usage
テクスチャの使われ方を示す引数。
引数の主な値としてD3DUSAGE_DYNAMICとD3DUSAGE_RENDERTARGETがある。
D3DUSAGE_DYNAMICはデータの読み書きを行えることを示す。
D3DUSAGE_RENDERTARGETはレンダーターゲットとして設定できることを示す。

- D3DFORMAT
テクスチャのフォーマットを示す引数。
カラー情報を格納するもの(D3DFMT_A8R8G8B8など)とデプスステンシル情報を格納するもの(D3DFMT_D24S8など)に大別される。

・D3DXCreateTextureの成否
- 複数のUsageを設定すると失敗。
- カラー情報を格納するD3DFORMATは、D3DUSAGE_DYNAMICとD3DUSAGE_RENDERTARGETの両方と組み合わせて設定できる。
- デプスステンシル情報を格納するD3DFORMATは、D3DUSAGE_RENDERTARGETと組み合わせて設定することができない。

・LockRectの成否
- D3DUSAGE_DYNAMICなら成功。

・SetRenderTargetの成否
- D3DUSAGE_RENDERTARGETなら成功。

以上のような条件があるため、下記サイトに示されているような問題が面倒が発生するようです。
http://marupeke296.com/DXG_No43_ZBufferTexture.html

↑このページのトップヘ