スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

これが マルチターゲットレンダリングなのです。

【リンク】 ◆解説系TOP◆
今回は、マルチターゲットレンダリングに挑戦してみました。

今まではずっとバックバッファに描画していたのですが↓、

【参考画像】
マルチターゲット2


実は、バックバッファ以外にも描画出来ます。

例えば、 バックバッファではなく テクスチャ にモデルを描画をして、
そのテクスチャを貼ったポリゴンをバックバッファに描画する
みたいな事が出来たりします。

【参考画像】
マルチターゲット3

今回も例の如く、 ソースコードがあるのですが、
そのソースコードを実行した結果がこちら。↓

【参考画像】
マルチターゲット


まず、 テクスチャに四角すいのポリゴンを描画して
その後に、 天上と底が無い箱みたいな形のポリゴン
四角すいが描画されたテクスチャを貼り付けてバックバッファに描画しています。
※背面カリングはしてません。

(平坦なポリゴンに3Dモデルが描画されたテクスチャを貼るので、何か面白いです。
 アニメーションさせたら 貼り付けたテクスチャが動きますし。)



大まかなやり方。
(細かい部分は、適宜解説します。)
-----------------------------------------------------------------
【1】新規テクスチャリソースを作成する。
【2】テクスチャの深度バッファを作成する。
【3】作成したテクスチャへアクセスする為のインターフェースを保存する。
【4】バックバッファへアクセスする為のインターフェースを保存する。
【5】レンダリングターゲットをテクスチャに変更する。
【6】テクスチャに何かを描画する。
【7】レンダリングターゲットをバックバッファに戻す。
【8】バックバッファに描画する。


【参考画像】
マルチターゲット4
-----------------------------------------------------------------

【1】新規テクスチャリソースを作成する。
まず、モデルを描画するためのテクスチャリソースを作成します。
作成には、CreateTexture関数を用います。

g_pD3DDevice->CreateTexture( 128,128,
1,
D3DUSAGE_RENDERTARGET,
D3DFMT_A8R8G8B8,
D3DPOOL_DEFAULT,
&g_pTexture,
NULL);

※128×128のテクスチャを作成。

そして、関数の詳細。

HRESULT CreateTexture(
UINT Width,
UINT Height,
UINT Levels,
DWORD Usage,
D3DFORMAT Format,
D3DPOOL Pool,
IDirect3DTexture9** ppTexture,
HANDLE* pHandle
);


Width・・・テクスチャの横幅を指定。
Height・・・テクスチャの縦幅を指定。
Levels・・・ミップマップのレベルを指定。 通常は1で問題ないです。
Usage・・・作成するテクスチャの使用法を設定する。
Format・・・作成するテクスチャのフォーマットを指定。([赤・緑・青]の情報を持つ、[赤・緑・青・透過度]の情報を持つ、などを指定する。)
Pool・・・作成するテクスチャの、メモリ確保方法を指定。
ppTexture・・・テクスチャ リソースを示す IDirect3DTexture9 インターフェイスへのポインタを指定。
pHandle・・・予約済み。NULLでOK。


【補足】
Levels(ミップマップレベル)について。
ミップマップとは、
同じイメージを徐々に低い解像度にした連続したテクスチャーの事です。
例えば、256×256のテクスチャをミップマップレベル4で作成すると、
128×128、64×64、32×32のテクスチャーも作成されます。
(256×256も含めて全部で4つ。)

で、これはどう利用されるかと言うと、例えば
256×256の元画像があった場合、32×32になるように画像を縮小しながら表示するよりも、
予め縮小した32×32の画像を用意しておいて、それをペタッと貼ったほうが速いのです。
また、適切な大きさを選ぶ事によって、テクスチャーの品質が向上します。
※その代わり、当然メモリの使用量が増えます。 諸刃の剣。

【参考URL】ミップマップによる テクスチャーフィルタリング


Usage(使用法)について。
これの指定には、定数D3DUSAGEを用います。
今回はテクスチャをレンダリングターゲットとして使用するので、
D3DUSAGE_RENDERTARGETを指定します。

【参考URL】定数 D3DUSAGE


Pool(メモリ確保方法)について。
メモリ確保方法は、D3DPOOL 列挙型で指定します。
色々とあるのですが、デフォルト指定(D3DPOOL_DEFAULT)が無難、との事。

【参考URL】D3DPOOL 列挙型


【2】テクスチャの深度バッファを作成する。
テクスチャをレンダリングターゲットにする以上、奥行きの情報も持たせないといけません。
なので、新規作成したテクスチャ用の深度バッファも確保します。

g_pD3DDevice->CreateDepthStencilSurface(
128,128,
D3DFMT_D16,
D3DMULTISAMPLE_NONE,
0,
TRUE,
&g_pTexz,
NULL);


こちらも、関数の詳細。↓
HRESULT CreateDepthStencilSurface(          
UINT Width,
UINT Height,
D3DFORMAT Format,
D3DMULTISAMPLE_TYPE MultiSample,
DWORD MultisampleQuality,
BOOL Discard,
IDirect3DSurface9** ppSurface,
HANDLE* pHandle
);


Width・・・深度バッファの横幅を指定。 (新規作成したテクスチャと同じ大きさにする)
Height・・・深度バッファの縦幅を指定。 (新規作成したテクスチャと同じ大きさにする)
Format・・・深度バッファのフォーマットを指定。(フォーマットについては前述)
MultiSample・・・マルチサンプリング(補間方法)を指定。
MultisampleQuality・・・画像の品質レベルを指定。
Discard・・・z バッファの破棄を有効にするか無効にするかを指定。(TRUEかFALSE)
ppSurface・・・深度バッファの格納先を示すポインタのアドレスを指定。
pHandle・・・予約済み。常にNULL。


【補足】
マルチサンプリング(補間方法)について
これは、 D3DMULTISAMPLE_TYPE 列挙型で指定します。
今回は利用しない(D3DMULTISAMPLE_NONE)にしています。

【参考URL】D3DMULTISAMPLE_TYPE 列挙型

画像の品質レベルについて
これは、0からnまでの値を指定できます。
で、nというのは
CheckDeviceMultiSampleType関数のpQualityLevelsに返される戻り値 - 1の値です。

【参考URL】IDirect3D9::CheckDeviceMultiSampleType メソッド


【3】作成したテクスチャへアクセスする為のインターフェースを保存する。
次に、テクスチャへアクセスする為のインターフェースを保存します。
g_pTexture->GetSurfaceLevel(0, &g_pTexSurface);

第一引数に、ミップマップのレベルを指定。 (元画像はレベル0)
第二引数に、アクセスしたいサーフェイスを示すIDirect3DSurface9型の変数を指定。

インターフェースを保存しておけば、それをデバイスにセットして
リソースなどにアクセス出来るようになります。
(上記の画像3段目の図)


【4】バックバッファへアクセスする為のインターフェースを保存する。
次に、 バックバッファに関する情報を保存します。
保存するのは、下記の3つです。
-----------------------------------
・バックバッファのビューポート
・バックバッファのインターフェース
・バックバッファの深度バッファ

-----------------------------------
これらの情報を、保存せずにレンダリングターゲットをテクスチャに切り替えた場合
このようになります。↓
マルチターゲット5

バックバッファを示すものがなくなります。
つまり、二度とバックバッファにアクセスできなくなります。

なので、切り替える前にバックバッファのインターフェースなどを保存
しないといけないのです。
(一番最初の画像を参考にして下さい。)

で、情報はそれぞれ
---------------------------------
・GetViewport関数  (ビューポート)
・GetRenderTarget関数  (インターフェース)
・GetDepthStencilSurface関数  (深度バッファ)

---------------------------------
で取得できます。

【参考URL】GetViewport メソッド
【参考URL】GetRenderTarget メソッド
【参考URL】GetDepthStencilSurface メソッド


【5】レンダリングターゲットをテクスチャに変更する。



【6】テクスチャに何かを描画する。
【7】レンダリングターゲットをバックバッファに戻す。
【8】バックバッファに描画する。



【ソースコード】Sample_MultiTarget.txt


<~続きは明日!~>
スポンサーサイト

テーマ : ゲーム製作 関連 - ジャンル : ゲーム

コメント
コメントの投稿
管理者にだけ表示を許可する



上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。