繁体   English   中英

在现有图形应用程序上绘制DirectX / OpenGL图形

[英]Draw DirectX/OpenGL Graphics on an existing graphics application

首先,让我直接道歉,以防已经回答,因为我可能只是在不规则的搜索条件下搜索它。

我期待在使用DirectX绘制自己的图形(游戏)的应用程序中绘制2D图形。 我将通过在应用程序中注入一个DLL(那部分我没有任何问题,我可以这样做)和绘制我的图形来做到这一点。 但是我并不擅长DirectX / OpenGL,我还有几个基本问​​题要问。

1)为了在该窗口上绘制图形,我是否需要从过程存储器中获取预先存在的上下文,这是绘图场景的某种处理?

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

请告诉我如何处理这个问题。 任何细节将不胜感激:-)提前谢谢你。

注入DLL的方法确实是正确的方法。 FRAPS这样的程序使用相同的方法。 我无法告诉你有关Direct3D的方法,但对于OpenGL,你可以做以下事情:

首先,你必须进入opengl32.dll的函数wglMakeCurrentglFinishwglSwapBuffers ,以便在选择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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM