我想在一个使用DirectX绘制自己图形(游戏)的应用程序中绘制2D图形。我将通过将DLL注入到应用程序中来实现这一点(这部分我没有问题,我可以做到),并且绘制我的图像。但是我对DirectX / OpenGL不太熟悉,有一些基本问题要问。
1)为了在该窗口上绘制图形,我是否需要从进程内存获取预先存在的上下文,某种绘图场景的句柄?
2)如果应用程序使用DirectX,我能否在其上使用OpenGL图形?
请让我知道如何处理这个问题。任何细节将不胜感激:-) 提前谢谢。
“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互操作性(简称Interop)。
以下是一个示例: https://sites.google.com/site/snippetsanddriblits/OpenglDxInterop 我不知道他们使用的扩展是否仅适用于nVidia设备,请自行确认。
还有一件事情,你需要一个非常好的动机才能这样做,通常我会选择使用DX进行钩子和渲染。 我认为不同DX版本之间的内部Interop是更好的选择。 对于自己的渲染代码,我个人可能会选择DirectX9。 当然,如果你只需要支持单个DirectX版本,则不需要Interop。
奖励: 如果您需要生成C++类的完整包装器、快速而简单的dll包装器或者一般的全局函数钩子,可以使用我创建的这个库: http://code.google.com/p/hookit/ 它远未经过充分测试,只是我在两天内编写的东西,但我发现它非常有用。
请注意,在您的情况下,我建议使用VTable hooking,您可能需要将函数偏移量硬编码到表中,但这不太可能改变。
祝你好运 :)