2012-06-22 80 views
2

我想通過使用「memcpy」函數將我的DirectX屏幕從backbuffer捕獲到內存地址。 ,所以我寫了這個代碼:Directx Backbuffer capture

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

但是當程序運行我得到這個錯誤:

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

它薩姆斯lockedRect.pBits或:在這條線

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

和程序中斷lockedRect.Pitch地址mem不是創建.... 你覺得呢? 請幫我解決這個問題。 謝謝。

回答

0

您使用過D3DMEM_POOL嗎?你確定backbuffer格式爲X8A8R8B8嗎?

0

試圖找到相同的答案。從某些來源我可以看出,後臺緩衝區是特定於應用程序的。即它們將數據寫在綁定到它們的後臺緩衝區中。

我想弄清楚GetBackBuffer()中的第一個參數在哪裏起作用?它是iSwapChain。 MSDN的幫助很少。