Direct3D钩子覆盖

时间:2011-01-19 21:57:21

标签: hook overlay render direct3d

我正在尝试实现类似Fraps程序的效果,这是游戏顶部的叠加,为此我在调用原始函数之前挂钩IDirect3DDevice9::EndScene函数并渲染内容。但是,当我渲染东西时,它会混淆游戏已经绘制的效果,并且无法正确绘制。我的钩子看起来像

HRESULT __stdcall endscene_hook(IDirect3DDevice9* id3d_device) {
    if (pGameOverlay) {
         pGameOverlay->Render();
    }

    return endscene_orig(dev);
}

wherer pGameOverlay只是指向一个类的指针,Render方法只是将一些东西绘制到之前设置的设备(未显示)。还有什么我应该做的吗?

我在某地读过Fraps实际挂钩Present方法,而不是EndScene。这是正确的,如果是的话,为什么?你不能在调用BeginScene之间只有一个EndScene / Present对吗?

1 个答案:

答案 0 :(得分:4)

每个礼物肯定有多个BeginScene/EndScene,这实际上是很常见的做法。通常,每个单独的渲染目标使用一对BeginScene/EndScene。 (附加渲染目标的一个示例可能是镜像,但是有多个渲染目标的许多其他用途,如阴影缓冲区或后处理效果的专用深度目标)。

挂钩礼物更加安全,因为这是实际“显示”(呈现)对用户所做的任何事情的调用,因此从定义中每帧有一个礼物(因为这正是这个礼物定义框架。