我想通过使用“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没有创建.... 你怎么想? 请帮我解决这个问题。 谢谢。
答案 0 :(得分:0)
您使用过D3DMEM_POOL吗?你确定后备缓冲格式X8A8R8B8?
答案 1 :(得分:0)
试图找到相同的答案。从某些来源,我能够发现后台缓冲区是特定于应用程序的。即他们在绑定到它们的后台缓冲区上写入数据。
我想弄清楚GetBackBuffer()中第一个参数扮演角色的位置?这是iSwapChain。 MSDN的帮助很少。