前者の方が高速であるため、 のGetRenderTargetData()
代わりにを使用することをお勧めします。GetFrontBufferData()
そうは言っても、それは実際の問題ではありません。フロントバッファから取得したデータ、または現在画面上で観察しているものをテクスチャに保存したいと考えています。
まず第一に、実際には一種の兄弟ですがIDirect3DTexture9
、クラス階層のある時点で収束しても同じではありません(リソースであるため、これは論理的です)。両方の優れた点は、共通の機能を実装していることです。特にLockRect()の可能性と、サーフェス (つまり、大まかに言うと、1 つのミップマップ レベル サーフェス (ピクセルの集まり) からテクスチャ (これは複数のミップマップ レベルで構成される場合があります) したがって、ターゲットはテクスチャ オブジェクトの level0 サーフェスです。IDirect3DSurface9
IDirect3DResource9
それを念頭に置いて、すべてCreateOffscreenPlainSurface()
が独立していると見なされるため、このサーフェスが子である可能性のある親テクスチャを見つけることができません (テクスチャの特定のミップマップです)。簡単に言うと、両方とも LockRect せずにデータを手動でコピーする場合は、 を使用できますStretchRect()
。
その名前はその目的の 1 つを示すものではないかもしれませんが、ここで私たちを助けてくれます。テクスチャとサーフェスの比較の話を思い出してください。サーフェスは兄弟のようなものです。テクスチャを適切に (サーフェスと同じように) 定義すると、実際には自動化された miplevels が得られ、それらの数を手動で定義できます。しかし、本質的に、これらの各レベルは表面です。また、IDirect3DSurface9 から IDirect3DTexture9 への「変換」は、適切なミップレベル サーフェスを埋めるだけの問題です (この場合は、基本的にスクリーンショットであるため、レベル 0 にする必要があります)。
したがって、これを粗いコードに入れると、次のようになります。
IDirect3DTexture9* texture; // needs to be created, of course
IDirect3DSurface9* dest = NULL; // to be our level0 surface of the texture
texture->GetSurfaceLevel(0, &dest);
g_pD3DDevice->StretchRect(pSurface, NULL, dest, NULL, D3DTEXF_LINEAR);
これで、IDirect3DTexture9 が 1 つ残りました。それとフライドポテトはいかがですか?私はここでメモリを使って作業していることに注意してください.DX9にはかなり長い間触れていません(DX10を支持してドロップしました)。それが役に立てば幸い。