我希望通过代理d3d9.dll为DirectX 9游戏添加免费外观(即使游戏禁用它)。我在C ++中有一个简单代理的源代码。游戏本身不是开源的,但开发人员对mods的关注度较低。
我知道这是可能的,因为当两只眼睛之间的距离设置得非常高时,使用代理dll(如IZ3D)的一些3D anaglpyh驱动程序黑客会旋转场景。网络上的此效果代码(至少使用Google)根本不存在。请记住,游戏使用着色器并且没有明显使用矩阵堆栈。
我该怎么做?
答案 0 :(得分:0)
一般而言,大多数3D着色器使用一组三个矩阵来确定顶点如何转换为屏幕空间。在DirectX中,这些通常被称为World,View和Projection矩阵(在GL中,'World'矩阵通常被称为'Model')。在D3D9中,这些矩阵将被设置为着色器常量(通过IDirect3DDevice9 :: SetVertexShaderConstantF)。另请注意,通常的做法是在将这些矩阵传递到顶点着色器之前将这些矩阵连接到CPU上的单个矩阵中,这样就不会在每个顶点执行冗余计算。
假设这是您尝试代理的游戏中着色器的设置,您需要确定要定位的着色器(例如,哪些是3D世界对象着色器)。请注意,游戏中可能存在不用于3D世界渲染的着色器,例如用于UI的着色器(如果适用)。然后,当目标着色器处于活动状态时,拦截对IDirect3DDevice9 :: SetVertexShaderConstantF的任何调用,并修改与将顶点转换为屏幕空间相关联的统一。这将需要一些试验和错误,当然还有HLSL反汇编的一些知识,因为我假设你没有着色器的来源。
如果您计划以任何重要方式修改转换的“视图”部分(例如,相机正在查看的位置),即使完成此操作,您也很可能无法获得所需的结果。原因在于,许多游戏系统经常在CPU上执行3D世界计算,这显然不会影响。最明显的例子是基于平截头体的剔除系统,它确定要渲染的对象。因为代理不会修改这样的系统,所以你可以“看空空间”。