强制闭源应用程序使用 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"。