Directx Backbuffer capturing



我想使用"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);
它相同的锁定矩形.

pBits或锁定的矩形.音高地址mem没有创建....你怎么看?请帮我解决这个问题。谢谢。

你用过D3DMEM_POOL吗?您确定后台缓冲区格式X8A8R8B8吗?

试图找到相同的答案。从某些来源中,我能够发现有后台缓冲区是特定于应用程序的。即它们将数据写入绑定到它们的后台缓冲区。

我试图弄清楚 GetBackBuffer() 中的第一个参数在哪里发挥作用?它是iSwapChain。MSDN的帮助很少。

相关内容

  • 没有找到相关文章

最新更新