2

「memcpy」関数を使用して、Directx画面をバックバッファからメモリアドレスにキャプチャしたい。だから私はこのコードを書いた:

int ScreenWidth =1024;
int ScreenHeight =768;
int BITSPERPIXEL =32; // XRGB

BYTE* pBits ;
IDirect3DSurface9* pSurface;

pBits=new BYTE[ScreenWidth*ScreenHeight * 4 ]; //1024 x 768 x 4 for XRGB

pd3dDevice->CreateOffscreenPlainSurface(ScreenWidth , ScreenHeight ,
                                          D3DFMT_X8R8G8B8, D3DPOOL_SYSTEMMEM, 
                                          &pSurface, NULL);

pd3dDevice->GetBackBuffer(0,0,D3DBACKBUFFER_TYPE::D3DBACKBUFFER_TYPE_MONO, &pSurface);      


D3DLOCKED_RECT lockedRect;
pSurface->LockRect(&lockedRect,NULL,
                   D3DLOCK_NO_DIRTY_UPDATE|
                   D3DLOCK_NOSYSLOCK|D3DLOCK_READONLY);
for( int i=0 ; i < ScreenHeight ; i++)
{
    memcpy( (BYTE*) pBits + i * ScreenWidth * BITSPERPIXEL / 8 , 
        (BYTE*) lockedRect.pBits + i* lockedRect.Pitch , 
        ScreenWidth * BITSPERPIXEL / 8);
}
pSurface->UnlockRect();

しかし、プログラムを実行すると、このエラーが発生しました:

Unhandled exception at 0x58b6be20 (msvcr100d.dll) in SimpleSample.exe: 0xC0000005: Access violation reading location 0x00000000.

この行のプログラムブレーク:

 memcpy( (BYTE*) pBits + i * ScreenWidth * BITSPERPIXEL / 8 , 
        (BYTE*) lockedRect.pBits + i* lockedRect.Pitch , 
        ScreenWidth * BITSPERPIXEL / 8);

それはlockedRect.pBitsまたはlockedRect.Pitchアドレスmemが作成されなかったのと同じです....あなたはどう思いますか?この問題を解決するのを手伝ってください。ありがとうございました。

4

2 に答える 2

0

D3DMEM_POOL を使用しましたか? バックバッファのフォーマットが X8A8R8B8 でよろしいですか?

于 2012-10-24T10:43:53.980 に答える
0

同じことの答えを見つけようとしています。いくつかの情報源から、バック バッファーがアプリケーション固有であることがわかります。つまり、バインドされたバック バッファにデータを書き込みます。

GetBackBuffer() の最初のパラメーターがどこで役割を果たしているのかを把握しようとしていますか? アイスワップチェーンです。MSDN ヘルプはほとんどありません。

于 2012-11-01T08:53:05.313 に答える