4

首先,让我马上道歉,以防万一这已经得到回答,因为我可能只是在不规则的搜索条件下搜索它。

我希望在使用 DirectX 绘制自己的图形(游戏)的应用程序中绘制 2D 图形。我将通过将 DLL 注入应用程序(我对此毫无疑问,我可以做到)并绘制我的图形来做到这一点。但不是很擅长 DirectX/OpenGL,我有几个基本问​​题要问。

1)为了在该窗口上绘制图形,我是否需要从进程内存中获取预先存在的上下文,某种绘图场景的句柄?

2) 如果应用程序使用 DirectX,我可以在其上使用 OpenGL 图形吗?

请让我知道如何处理这个问题。任何细节将不胜感激:-) 提前谢谢您。

4

2 回答 2

3
于 2013-08-03T14:23:17.067 回答
1

“1)为了在那个窗口上绘制图形,我需要从进程内存中获取一个预先存在的上下文,某种绘图场景的句柄吗?”

是的,你需要确保你的钩子捕捉到重要的上下文创建函数。例如,您对 d3d 中 CreateDevice 的所有变体都很感兴趣。

您没有提及您使用的是哪个 DirectX,但版本之间存在一些差异。例如,在 DirectX 9 中,您最感兴趣的函数是: 1. 创建/返回 IDirect3DSwapChain9 对象 2. 创建/返回 IDirect3DDevice9,IDirect3DDevice9Ex 对象

在较新版本的 DirectX 中,它们的代码被分成(大部分)Device、DeviceContext 和 DXGI。如果您正在执行“特定任务”,请分享您正在处理的 Directx 版本。

除了捕获所有需要的对象以允许您自己的渲染之外,您还希望捕获所有演示事件(GL 中的“SwapBuffers”,DX 中的“Present”),因为那是您想要添加叠加层的时间。

由于您似乎试图在 DX 应用程序之上渲染覆盖,请允许我警告您,制作一个真正通用的解决方案(适用于所有游戏)并不容易。主要是因为需要支持不同的 DX 版本以及多种创建方式 如果您专注于特定的游戏/应用程序,自然会容易得多。

“2.如果应用程序使用DirectX,我可以在上面使用OpenGL图形吗?”

嗯,首先是的。这是可能的。您要搜索的术语是 OpenGL DirectX 互操作性(或简称互操作)

这是一个示例: https ://sites.google.com/site/snippetsanddribbits/OpenglDxInterop 我不知道他们使用的扩展是否仅在 nVidia 设备中可用 - 检查它。

另一件事是你需要一个非常好的动机才能做到这一点,通常我会简单地坚持使用 DX 进行挂钩和渲染。我认为不同 DX 版本之间的内部互操作是更好的选择。我个人可能会为您自己的渲染代码使用 DirectX9。当然,如果您只需要支持单个 DirectX 版本,则不需要互操作。

奖励:如果您需要生成 C++ 类的完整包装器、快速的脏 dll 包装器,或者只是一般的全局函数挂钩,请随意使用我创建的这个库: http ://code.google.com/p /hookit/ 它远不是一个经过全面测试的工具,只是我 2 天破解的东西,但我发现它非常有用。

请注意,在您的情况下,我建议仅使用 VTable 挂钩,您可能必须将函数偏移量硬编码到表中,但这不太可能改变。

祝你好运 :)

于 2013-08-10T07:57:42.780 回答