昔のものですが必要になったのでメモ。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 にコンバート。