0

我正在围绕 DirectX 6.1 库编写 w​​indows32 挂钩到 DirectX 9.0c;想法是将所有对 DX 6.1 3D 设备的调用替换为对 Direct 9.0c 的调用并注入一些自定义代码,因此我正在修补的旧游戏(99 年)将能够使用着色器、后期效果等。

旧的 DX 6.1 3D 设备是通过创建 DDraw 模块创建的。然后游戏正在枚举设备上限。在我的模块中,整个 DDraw 模块被跳过并且 3D 视图被初始化。所以我有问题,因为我根本没有 DDraw 设备,所以我无法给游戏提供它需要的 Ddraw4 设备上限!

所以我的问题是如何在不初始化 DDraw4 设备的情况下获得 DDraw4 设备上限。也许创建固定列表并将其提供给游戏就足够了,但我不知道该列表应该是什么(我给出了我认为应该的,并且游戏退出了 - 记录器显示它只是在设备上限之后检查)

4

2 回答 2

3

我从未尝试过,但您可以尝试以下方法。假设您没有 6.1 SDK,您可以自己制作DDCAPS结构(DirectDraw 结构)(它基本上只是 DWORD),然后使用 DX9 GetDeviceCaps获取功能( D3DCAPS9 )功能。接下来,从获取的上限中获取所需的值(使用 DX9)并在 DDCAPS 结构中设置 DirectDraw 的等效值。然后,您可以将这个填充的大写结构提供给游戏。一些警告——正如你所提到的,你不知道它具体需要什么,所以它有点碰运气(除非你有源代码)。此外,caps 结构值可能没有 1:1 映射(在 DX9 和 DDraw 之间)。最后——这与没有 6.1 SDK 有关——如果您不知道标志值,则在根据获得的上限设置值时可能会错误地设置标志。正如我所提到的,这可能是遥不可及的(或需要大量的侦探工作),但我认为这可能是你可以尝试的。

于 2010-07-16T09:10:09.733 回答
0

该解决方案有点粗糙,但最重要的是 - 完美无缺。

我编写了一个小型的自包含实用程序,它初始化 DDraw 6.1,而不是获取设备上限,然后将它们转储到磁盘上的文件中(设备上限是普通的旧 C 格式结构,所以保存它非常简单)并退出。然后我可以从磁盘读取设备 caps 文件,并在应用程序询问我时返回它。

于 2011-02-10T21:44:11.317 回答