[英]Draw DirectX/OpenGL Graphics on an existing graphics application
首先,让我直接道歉,以防已经回答,因为我可能只是在不规则的搜索条件下搜索它。
我期待在使用DirectX绘制自己的图形(游戏)的应用程序中绘制2D图形。 我将通过在应用程序中注入一个DLL(那部分我没有任何问题,我可以这样做)和绘制我的图形来做到这一点。 但是我并不擅长DirectX / OpenGL,我还有几个基本问题要问。
1)为了在该窗口上绘制图形,我是否需要从过程存储器中获取预先存在的上下文,这是绘图场景的某种处理?
2)如果应用程序使用DirectX,我可以使用OpenGL图形吗?
请告诉我如何处理这个问题。 任何细节将不胜感激:-)提前谢谢你。
注入DLL的方法确实是正确的方法。 像FRAPS这样的程序使用相同的方法。 我无法告诉你有关Direct3D的方法,但对于OpenGL,你可以做以下事情:
首先,你必须进入opengl32.dll
的函数wglMakeCurrent
, glFinish
和wglSwapBuffers
,以便在选择OpenGL上下文进行绘制时注意到你的DLL。 将他们的电话传递给操作系统。 当wglMakeCurrent
,使用函数GetPixelFormat
来查明窗口是否是双缓冲的。 还可以使用glGet…
OpenGL调用来找出您正在处理的OpenGL上下文版本。 如果您有遗留的OpenGL上下文,则必须使用不同的方法来绘制叠加层,而不是使用现代OpenGL-3或更高版本的核心上下文。
如果是双缓冲窗口,请使用wglSwapBuffers
上的Hook执行进一步的OpenGL绘图操作。 OpenGL只是在画布上绘制的笔和画笔(以点,线和三角形的形式)。 然后通过wglSawpBuffers
调用使所有内容都可见。
在单个缓冲的上下文而不是wglSwapBuffers
的情况下, wglSwapBuffers
的函数是glFinish
。
使用OpenGL绘制2D就像禁用深度缓冲和使用正交投影矩阵一样简单。 您可以随时更改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互操作性(或简称互操作)
以下是一个示例: https : //sites.google.com/site/snippetsanddriblits/OpenglDxInterop我不知道他们使用的扩展程序是否仅在nVidia设备中可用 - 请检查它。
关于这一点的另一个问题是,为了做到这一点你需要一个非常好的动力,通常我会坚持使用DX来进行挂钩和渲染。 我假设不同DX版本之间的内部互操作是更好的选择。 我个人可能会使用DirectX9来获取自己的渲染代码。 当然,如果您只需要支持单个DirectX版本,则不需要互操作。
额外:如果您需要生成完整的C ++类包装器,快速的脏dll包装器,或者只是一般的全局函数挂钩,请随意使用我创建的这个库: http : //code.google.com/p / hookit /它远不是一个经过全面测试的工具,只是我被攻击了2天,但我发现它非常有用。
请注意,在您的情况下,我建议只使用VTable挂钩,您可能必须将函数偏移硬编码到表中,但这不太可能改变。
祝好运 :)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.