gpt4 book ai didi

c++ - 为 DirectX9 使用 C++ 代理 dll,如何旋转场景?

转载 作者:太空宇宙 更新时间:2023-11-04 13:36:09 25 4
gpt4 key购买 nike

我希望通过代理 d3d9.dll 为 DirectX 9 游戏添加自由外观(即使游戏禁用它)。我有 C++ 中简单代理的源代码。游戏本身不是开源的,但开发者并不在意模组。

我知道这是可能的,因为一些使用代理 dll 的 3D anaglpyh 驱动程序 hack(如 IZ3D)在两只眼睛之间的距离设置得非常高时会旋转场景。在网络上实现这种效果的代码(至少,使用谷歌)根本不存在。请记住,该游戏使用着色器并且没有明显使用矩阵堆栈。

我该怎么做?

最佳答案

一般而言,大多数 3D 着色器使用一组三个矩阵来确定如何将顶点转换为屏幕空间。在 DirectX 中,这些通常称为世界、 View 和投影矩阵(在 GL 中,“世界”矩阵通常称为“模型”)。在 D3D9 中,这些矩阵将被设置为着色器常量(通过 IDirect3DDevice9::SetVertexShaderConstantF)。另请注意,通常的做法是在将这些矩阵传递给顶点着色器之前将它们连接到 CPU 上的单个矩阵中,这样就不会针对每个顶点执行冗余计算。

假设这是您尝试代理的游戏中着色器的设置,您需要确定要定位的着色器(例如,哪些是 3D 世界对象着色器)。请注意,游戏中可能存在不适用于 3D 世界渲染的着色器,例如用于 UI 的着色器(如果适用)。然后,当目标着色器处于事件状态时拦截对 IDirect3DDevice9::SetVertexShaderConstantF 的任何调用,并修改与将顶点转换为屏幕空间相关联的制服。这将需要一些试验和错误,当然,还需要一些 HLSL 反汇编知识,因为我假设您没有着色器的源代码。

即使实现了这一点,如果您打算以任何重要方式修改转换的“ View ”部分(例如,相机所注视的位置),您也很可能得不到想要的结果。原因是许多游戏系统经常在 CPU 上执行 3D 世界计算,而这显然不会受到影响。最明显的例子是基于视锥体的剔除系统,它决定渲染哪些对象。因为代理不会修改这样的系统,所以您可能会“望向一片空白”。

关于c++ - 为 DirectX9 使用 C++ 代理 dll,如何旋转场景?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29522056/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com