Hook Direct3D钩子覆盖

Hook Direct3D钩子覆盖,hook,overlay,render,direct3d,Hook,Overlay,Render,Direct3d,我正在尝试实现一种像Fraps程序一样的效果,这是一种覆盖在游戏顶部的效果,为此,我在调用原始函数之前挂起IDirect3DDevice9::EndScene函数并渲染内容。然而,当我渲染东西时,它会弄乱游戏已经绘制的效果,并且不能正确绘制自己。我的钩子看起来就像 HRESULT __stdcall endscene_hook(IDirect3DDevice9* id3d_device) { if (pGameOverlay) { pGameOverlay->Re

我正在尝试实现一种像Fraps程序一样的效果,这是一种覆盖在游戏顶部的效果,为此,我在调用原始函数之前挂起IDirect3DDevice9::EndScene函数并渲染内容。然而,当我渲染东西时,它会弄乱游戏已经绘制的效果,并且不能正确绘制自己。我的钩子看起来就像

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

    return endscene_orig(dev);
}
其中,R PGAMEOVERY只是一个指向一个类的指针,该类的Render方法只是将一些东西绘制到它之前设置的设备上,但没有显示。我还有别的事要做吗


我在某个地方读到Fraps实际上钩住了当前的方法,而不是EndScene。这是正确的吗?如果是,为什么?你不能在两次调用之间只有一对BeginScene/EndScene来呈现吗?

你可以为每个呈现设置多个BeginScene/EndScene,这实际上是一种很常见的做法。通常,一对BeginScene/EndScene用于每个单独的渲染目标。附加渲染目标的一个示例可能是镜像,但多个渲染目标还有许多其他用途,如阴影缓冲区或用于后处理效果的专用深度目标


挂接呈现要安全得多,因为这是一个调用,它实际显示对用户所做的任何事情,因此从定义上看,每个帧都有一个呈现,因为这正是定义帧的呈现。

对于每个呈现,您肯定可以有多个BeginScene/EndScene,这实际上是一种很普遍的做法。通常,一对BeginScene/EndScene用于每个单独的渲染目标。附加渲染目标的一个示例可能是镜像,但多个渲染目标还有许多其他用途,如阴影缓冲区或用于后处理效果的专用深度目标


挂接礼物要安全得多,因为这是一个实际显示对用户所做的任何事情的调用,因此,从定义上看,每个帧都有一个呈现,因为这正是定义帧的呈现。

作为一个基本的理智检查,挂钩本身没有造成混乱:当你使用pgameovery->Render时,一切看起来正常吗?@Suma yes,当我不渲染我自己的东西时,所有东西都会正常渲染。就像一个基本的理智检查一样,钩子本身不会造成混乱:当你使用PGAMEOVERY->render时,所有东西看起来都正常吗?@Suma Yep,当我不渲染我自己的东西时,所有东西都会正常渲染。谢谢,这就是我需要知道的。谢谢,这就是我需要知道的。