使用DirectX9的C++代理dll,如何旋转场景

Using a C++ proxy dll for DirectX9, how would one rotate a scene?

本文关键字:旋转 何旋转 DirectX9 C++ 代理 dll 使用      更新时间:2023-10-16

我想通过代理d3d9.dll为DirectX 9游戏添加免费外观(即使游戏禁用了它)。我有C++中一个简单代理的源代码。游戏本身不是开源的,但开发者对mods毫不关心。

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

我该怎么做?

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

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

即使完成了这一点,如果你计划以任何重要的方式修改变换的"视图"部分(例如,相机正在看的地方),你也很可能得不到你想要的结果。原因是,许多游戏系统经常在CPU上执行3D世界计算,这显然不会影响。最明显的例子是一个基于截头体的剔除系统,它可以确定要渲染的对象。因为代理不会修改这样的系统,所以您可能会"看着空白的空间"。