D3D注入一个设备,多个renderTargets - >从backbuffer抓取Imagebits

时间:2013-01-11 14:43:51

标签: dll code-injection direct3d

我有一个游戏,我注入一个directx dll来抓取图像。多数民众赞成我如何抓住图像位:

void dumb_buffer(LPDIRECT3DDEVICE9 pDevice){

    ret = pDevice->GetRenderTarget(0,&pRenderTarget);
    ret = pRenderTarget->GetDesc(&rtDesc);

    pDevice->CreateOffscreenPlainSurface(rtDesc.Width, rtDesc.Height,rtDesc.Format,   
                                            D3DPOOL_DEFAULT, &pDestTarget, NULL);


    pDevice->GetRenderTargetData(pRenderTarget,pDestTarget);

    if(pDestTarget != NULL){
       pDestTarget->LockRect(&rect,0, D3DLOCK_READONLY);
       bits = (unsigned char*)rect.pBits;
       pDestTarget->UnlockRect();
       pDestTarget->Release();
    }

    pRenderTarget->Release();
}

void dumb_buffer(LPDIRECT3DDEVICE9 pDevice){ ret = pDevice->GetRenderTarget(0,&pRenderTarget); ret = pRenderTarget->GetDesc(&rtDesc); pDevice->CreateOffscreenPlainSurface(rtDesc.Width, rtDesc.Height,rtDesc.Format, D3DPOOL_DEFAULT, &pDestTarget, NULL); pDevice->GetRenderTargetData(pRenderTarget,pDestTarget); if(pDestTarget != NULL){ pDestTarget->LockRect(&rect,0, D3DLOCK_READONLY); bits = (unsigned char*)rect.pBits; pDestTarget->UnlockRect(); pDestTarget->Release(); } pRenderTarget->Release(); }

在第一帧中一切正常,rtDesc看起来像这样:

rtDesc.Format = D3DFMT_R32F
rtDesc.width = 1920
rtDesc.height = 1200 
在第二帧中,rtDesc现在看起来像这样: rtDesc.Format = D3DFMT_R32F rtDesc.width = 1920 rtDesc.height = 1200

然后下一帧一切都很好,下一帧又是“1280070990”。

为什么表现如此? 有两种不同的渲染器吗?

另外,如果我开始注射并使用“dumb_buffer(..)”进行帧抓取,游戏中的帧率会下降并且游戏抖动。

这里还有两个截图:

luna-arts.de/others/misc/1.jpg

luna-arts.de/others/misc/2.jpg

看起来每个第二帧/运行都会创建一个1x1 Surface。

GetRenderTarget(..)和GetDesc(..)的返回值为 D3D_OK

游戏(VBS2)支持SLI图形卡,这个1x1 Surface是否可能像第二张图形卡的占位符?我现在正用一张图形卡进行操作。

设备始终相同,但renderTarget的地址在屏幕截图中看到的两个地址之间切换。所以看起来有两个renderTargets。

带有“if(...)”的代码正在运行,但帧速率下降且游戏抖动。我有什么想法可以解决这个问题吗?

在这个游戏的旧版本中一切正常。

此外,只要我在游戏菜单中只有一个renderTarget,一切正常,但只要我开始一个Level,就会出现第二个renderTarget。

非常感谢

关心丹尼斯

0 个答案:

没有答案