2

アプリケーションのフロントバッファデータから取得したサーフェスデータからテクスチャを作成する方法が見つからないようです。

これは私がかなり確実に機能しているコードです(Direct X 9、C ++)

// capture screen
IDirect3DSurface9* pSurface;
g_pd3dDevice->CreateOffscreenPlainSurface(640, 480,
    D3DFMT_A8R8G8B8, D3DPOOL_SCRATCH, &pSurface, NULL);
g_pd3dDevice->GetFrontBufferData(0, pSurface);

frontBufferDataを取得したので、それを使用してIDirect3DTexture9オブジェクトを作成します。

この関数/D3DXCreateTextureFromFileInMemory/は最も論理的であるように見えましたが、うまくいかないようです。

私はこれを行う方法があるとかなり確信しています、難しい私は方法がわかりません。どんな助けでも大歓迎です!

ありがとう!

4

1 に答える 1

5

前者の方が高速であるため、 のGetRenderTargetData()代わりにを使用することをお勧めします。GetFrontBufferData()そうは言っても、それは実際の問題ではありません。フロントバッファから取得したデータ、または現在画面上で観察しているものをテクスチャに保存したいと考えています。

まず第一に、実際には一種の兄弟ですがIDirect3DTexture9、クラス階層のある時点で収束しても同じではありません(リソースであるため、これは論理的です)。両方の優れた点は、共通の機能を実装していることです。特にLockRect()の可能性と、サーフェス (つまり、大まかに言うと、1 つのミップマップ レベル サーフェス (ピクセルの集まり) からテクスチャ (これは複数のミップマップ レベルで構成される場合があります) したがって、ターゲットはテクスチャ オブジェクトの level0 サーフェスです。IDirect3DSurface9IDirect3DResource9

それを念頭に置いて、すべて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を支持してドロップしました)。それが役に立てば幸い。

于 2012-05-30T17:06:48.517 に答える