レンダーターゲット指定テクスチャの使い方
2008.12.01 [Mon] 14:11

参考サイト
http://tpot.jpn.ph/t-pot/program/index.html

手順
1.レンダーターゲットテクスチャ作成
2.バックバッファ&Zバッファを保持
3.テクスチャのサーフェイスを取得
4.レンダーターゲットをテクスチャに切り替え
5.テクスチャをクリア
6.なんか描画
7.レンダーターゲットを元に戻す
8.解放

説明

使う変数
LPDIRECT3DDEVICE9 pD3DDevice;
LPDIRECT3DSURFACE9 pBackBuffer;
LPDIRECT3DSURFACE9 pZBuffer;
LPDIRECT3DTEXTURE9 pTex;
LPDIRECT3DSURFACE9 pTexSurface;
HRESULT hr;

1.レンダーターゲットテクスチャ作成
hr = D3DXCreateTexture(pD3DDevice, Width, Height, 0,
  D3DUSAGE_RENDERTARGET, ←レンダーターゲット用指定
  D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &pTex);
if (FAILED(hr)) エラー処理

2.バックバッファ&Zバッファを保持
// バックバッファ
hr = pD3DDevice->GetRenderTarget(0, &pBackBuffer);
if (FAILED(hr)) エラー処理
// Zバッファ
hr = pD3DDevice->GetDepthStencilSurface(&pZBuffer);
if (FAILED(hr)) エラー処理

3.テクスチャのサーフェイスを取得
hr = pTex->GetSurfaceLevel(0, &pTexSurface);
if (FAILED(hr)) エラー処理

4.レンダーターゲットをテクスチャに切り替え
hr = pD3DDevice->SetRenderTarget(0, pTexSurface);
if (FAILED(hr)) エラー処理

5.テクスチャをクリア
hr = pD3DDevice->Clear(0, NULL,
  D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
  D3DCOLOR_XRGB(255, 255, 255), 1.0f, 0);
if (FAILED(hr)) エラー処理

6.なんか描画
なんかびょうがしてくだちぃ

7.レンダーターゲットを元に戻す
hr = pD3DDevice->SetRenderTarget(0, pBackBuffer);
if (FAILED(hr)) エラー処理
hr = pD3DDevice->SetDepthStencilSurface(pZBuffer);
if (FAILED(hr)) エラー処理

8.解放
SAFE_RELEASE(pBackBuffer);
SAFE_RELEASE(pZBuffer);
SAFE_RELEASE(pTexSurface);

>GetRenderTarget
>GetDepthStencilSurface
>GetSurfaceLevel
これらの関数は毎回内部で作成されていて
メモリリークの問題になるから、解放してから取得するようにね(´ω`)


これでレンダーターゲット指定したテクスチャが使えるぜ!!(゜∀゜)♪
適当に頂点バッファ作って貼り付けてみてくだちぃ

ちなみにDirectX SDK(November 2007)だと
テクスチャサイズ512x512までしか作れなかったorz