强制闭源应用程序使用 Direct3DDevice9Ex 而不是非 Ex 设备
Force closed source application to use Direct3DDevice9Ex instead of non-Ex device
基本上我想做的是强制使用 Direct3D9Ex
上下文 (CreateD3D9Ex)
但简单 "non-ex" 设备 (IDirect3DDevice9)
使用 Direct3DDevice9Ex
代替。
我在应用程序目录中放置了一个代理 dll,通常工作正常。现在我试图将对 CreateDevice
的调用重定向到原始 dll 的 CreateDeviceEx
然后只是 return 一个 "non-ex" 指针(以便应用程序使用 "Ex"设备而不知道)。
根据我的理解,这应该有效,因为 "Ex" 设备实现了 "non-ex" 设备也包含的所有方法 - 但显然肯定有一些区别,因为只有隐藏的东西才会被渲染"Ex"正在使用的设备是光标。
问:有人能告诉我我做错了什么或者给点建议吗?
背景
我正在使用一个 D3D9
应用程序,我想复制它的深度缓冲区。不幸的是,它的格式是 D24S8
,这意味着直接复制是不可能的。
所以我决定尝试是否可以创建一个共享的 depth/stencil 1 级纹理,然后使用实际上能够复制 [=48] 的 D3D10/D3D11
方法访问该纹理=] 表面。但是,只有 D3D9Ex
台设备能够创建具有共享句柄的纹理...
附录
由于 Direct3D9Ex 不支持托管池,这是不可能的。谢谢@VuVirt
我认为问题主要是D3D9Ex设备不支持D3DPOOL_MANAGED资源造成的。这就是为什么您在屏幕上看不到任何渲染的原因。使用 D3DPOOL_MANAGED 创建资源实际上会失败。如果有人想锁定它们,您可能还想挂钩所有资源创建例程并删除 D3DPOOL_MANAGED flag from the calls and optionally add D3DUSAGE_DYNAMIC。然而,这可能会导致另一组问题。在提供的 MSDN 链接中搜索 "Differences between Direct3D 9 and Direct3D 9Ex"。
基本上我想做的是强制使用 Direct3D9Ex
上下文 (CreateD3D9Ex)
但简单 "non-ex" 设备 (IDirect3DDevice9)
使用 Direct3DDevice9Ex
代替。
我在应用程序目录中放置了一个代理 dll,通常工作正常。现在我试图将对 CreateDevice
的调用重定向到原始 dll 的 CreateDeviceEx
然后只是 return 一个 "non-ex" 指针(以便应用程序使用 "Ex"设备而不知道)。
根据我的理解,这应该有效,因为 "Ex" 设备实现了 "non-ex" 设备也包含的所有方法 - 但显然肯定有一些区别,因为只有隐藏的东西才会被渲染"Ex"正在使用的设备是光标。
问:有人能告诉我我做错了什么或者给点建议吗?
背景
我正在使用一个 D3D9
应用程序,我想复制它的深度缓冲区。不幸的是,它的格式是 D24S8
,这意味着直接复制是不可能的。
所以我决定尝试是否可以创建一个共享的 depth/stencil 1 级纹理,然后使用实际上能够复制 [=48] 的 D3D10/D3D11
方法访问该纹理=] 表面。但是,只有 D3D9Ex
台设备能够创建具有共享句柄的纹理...
附录
由于 Direct3D9Ex 不支持托管池,这是不可能的。谢谢@VuVirt
我认为问题主要是D3D9Ex设备不支持D3DPOOL_MANAGED资源造成的。这就是为什么您在屏幕上看不到任何渲染的原因。使用 D3DPOOL_MANAGED 创建资源实际上会失败。如果有人想锁定它们,您可能还想挂钩所有资源创建例程并删除 D3DPOOL_MANAGED flag from the calls and optionally add D3DUSAGE_DYNAMIC。然而,这可能会导致另一组问题。在提供的 MSDN 链接中搜索 "Differences between Direct3D 9 and Direct3D 9Ex"。