【问题标题】:Directx Backbuffer capturingDirectx Backbuffer 捕获
【发布时间】:2012-06-22 05:31:59
【问题描述】:

我想使用“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 相同,没有创建...... 你怎么想? 请帮我解决这个问题。 谢谢。

【问题讨论】:

    标签: memory graphics directx capture directx-9


    【解决方案1】:

    您是否使用了 D3DMEM_POOL?你确定后缓冲格式是 X8A8R8B8 吗?

    【讨论】:

      【解决方案2】:

      试图找到相同的答案。从某些来源,我能够弄清楚后台缓冲区是特定于应用程序的。即他们在绑定到他们的后台缓冲区上写入数据。

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

      【讨论】:

        猜你喜欢
        • 2012-10-21
        • 1970-01-01
        • 2012-07-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多