Захват обратного буфера Directx

я хочу захватить мой экран Directx из резервного буфера в адрес памяти с помощью функции «memcpy». поэтому я написал эти коды:

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);

адресная память заблокированаRect.pBits или заблокированаRect.Pitch не была создана .... что вы думаете? пожалуйста, помогите мне решить эту проблему. Спасибо.


person Mantro Loman    schedule 22.06.2012    source источник


Ответы (2)


Вы использовали D3DMEM_POOL? Вы уверены, что формат бэкбуфера X8A8R8B8?

person Darthman    schedule 24.10.2012

Попытка найти ответ на то же самое. Из некоторых источников я могу выяснить, что обратные буферы зависят от приложения. то есть они записывают данные в привязанный к ним задний буфер.

Я пытаюсь выяснить, где играет роль первый параметр в GetBackBuffer()? Это iSwapChain. Помощь MSDN невелика.

person Eisen Jack    schedule 01.11.2012