Direct3D9 フレームバッファの保存

昔のものですが必要になったのでメモ。D3D9 です。
レンダリングした結果を保存するには
・BackBuffer を Lock して読み込んで保存
ですが、そのままでは RenderTarget は Lock できないので、
同じフォーマットかつ Lock 可能なサーフェースを作ってコピー。

IDirect3DSurface9*	iBackBuffer= NULL;
iDevice->GetBackBuffer( 0, 0, &iBackBuffer );

// copy先作成
D3DFORMAT	sformat= D3DFMT_A8R8G8B8;
//D3DFORMAT	sformat= D3DFMT_A16B16G16R16F;
IDirect3DSurface9*	iSurface= NULL;
iDevice->CreateRenderTarget(
		width,
		height,
		sformat,
		D3DMULTISAMPLE_NONE, 0,
		TRUE,	// lockable
		&iSurface
	);

// copy
iDevice->StretchRect( iBackBuffer, NULL, iSurface, NULL, D3DTEXF_NONE );

// 読み込み
D3DLOCKED_RECT	rect;
iSurface->LockRect( &rect, NULL, D3DLOCK_READONLY );

void*	ptr= rect.pBits;

  // ... 読み込み

iSurface->UnlockRect();

iSurface->Release();
iBackBuffer->Release();

16F は扱いづらいので、変換が必要なときは 32F にコンバート。