我正在尝试实现类似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
对吗?
答案 0 :(得分:4)
每个礼物肯定有多个BeginScene/EndScene
,这实际上是很常见的做法。通常,每个单独的渲染目标使用一对BeginScene/EndScene
。 (附加渲染目标的一个示例可能是镜像,但是有多个渲染目标的许多其他用途,如阴影缓冲区或后处理效果的专用深度目标)。
挂钩礼物更加安全,因为这是实际“显示”(呈现)对用户所做的任何事情的调用,因此从定义中每帧有一个礼物(因为这正是这个礼物定义框架。