我正在考虑一个安静的项目,这需要从OpenGL应用程序(尤其是游戏)中提取颜色和深度缓冲区。从操纵游戏本身或旨在“作弊”的目的而言,它与修改毫无关系,而仅仅是为了收集数据。
所以现在我正在尝试找出实现它的可能方法。当然,在Windows下使用Direct3D能够做到这一点甚至会导致更多可用的应用程序,但是由于我对Linux下的OpenGL非常熟悉,因此我将以这种方式开始。
由于实际上有许多改装/作弊应用程序可以操纵视频游戏的不同颜色/深度缓冲区(例如,自我射击游戏中的wallhacks),因此看来这肯定是有可能的。
现在的问题是,实现这一目标的最佳方法是什么? according to this thread可能无法直接读取GPU内存,因为OpenGL中的内存映射完全取决于供应商的实现,并且没有简单的方法来获取相应数据的VRAM地址。
我能想到的替代方法现在可以归类为静脉内或静脉内:
后一种方法肯定可以工作,但是可能需要付出更大的努力,并且需要针对每个应用程序进行。因此,首先肯定是首选,但是所描述的方法是否完全适用?当您拥有另一个OpenGL上下文值时,是否可以从不同进程访问OpenGL资源?有人有经验吗?
更新:
经过一番研究,我发现我所寻找的东西很普遍,通常被称为“ Hooking”或“拦截”。
对于OpenGL和Direct3D,有许多不同的库和程序可以做到这一点:
和许多其他人。
答案 0 :(得分:2)
事实上的标准方法是将您自己吸引到过程中,并将应用程序(游戏)进行的图形API调用重定向到您自己的代码。然后,您的钩子可以记录所需的任何数据,并在将调用传递给实际的API实现之前执行所需的任何操作。这样做有很多利弊,从建立具有相同接口的伪造库并欺骗游戏以加载该库而不是实际的图形库(DLL injection)到修改机器代码。用于进行函数调用的已加载过程映像会跳转到您的代码中。哪种方法适用和最适合您的情况将在很大程度上取决于许多因素,例如目标平台,目标应用程序,您希望使用的API等。
然而,任何这种方法的主要问题是,这实际上是多少作弊方法。因此,许多视频游戏都将带有内置保护功能,以防止此类事情的发生。在许多在线游戏中,您甚至可能尝试进行此类操作,从而冒着涉嫌作弊行为而被暂停帐户的风险。但这只是要注意的事情。以我的经验,它仍可用于许多游戏,尤其是单人游戏。
“从另一个进程中提取OpenGL上下文”将不起作用,至少在任何适当的操作系统上均不起作用。首先具有流程抽象的全部目的是将应用程序彼此隔离开来。
由于我没有足够的声誉在评论中提出这个问题,因此在这里让我问您您的目标到底是什么。您是否想在一帧中获取一次此信息,还是要在一段时间内记录多帧?您是否需要定制应用程序形式的自动化解决方案?如果两者都不行,您也许可以仅使用Nsight Graphics之类的图形调试工具来捕获并导出所需的帧…