强制关闭源应用程序使用Direct3DDevice9Ex而不是非Ex设备

时间:2017-08-14 09:15:24

标签: c++ directx directx-9

基本上我想做的是强制使用Direct3D9Ex上下文(CreateD3D9Ex)但使用简单的"非ex"设备(IDirect3DDevice9)代替使用Direct3DDevice9Ex。 我在应用程序目录中放置了一个代理DLL,这通常可以正常工作。现在,我正在尝试将CreateDevice的来电重定向到原来的dll' CreateDeviceEx,然后返回一个"非前"指针(以便应用程序使用" Ex"设备而不知道它)。

根据我的理解,这应该有效,因为" Ex"设备实现了所有方法" non-ex"设备还包含 - 但显然必须有一些区别,因为唯一的东西,如果隐藏的" Ex"设备正在使用的是光标。

问:有人可以告诉我我做错了什么或给出一些建议吗?

背景

我正在使用我要复制深度缓冲区的D3D9应用程序。不幸的是,它的格式是D24S8,这意味着直接拷贝是不可能的。

所以我决定尝试是否可以创建共享的深度/模板1级纹理,然后使用实际上能够复制深度/模板表面的D3D10/D3D11方法访问此纹理。但是,只有D3D9Ex设备能够使用共享句柄创建纹理...

附录

由于Direct3D9Ex不支持托管池,因此无法实现。谢谢@VuVirt

1 个答案:

答案 0 :(得分:2)

我认为问题主要是由于D3D9Ex设备不支持D3DPOOL_MANAGED资源。这就是为什么你没有在屏幕上看到任何渲染的原因。使用D3DPOOL_MANAGED创建资源实际上会失败。您可能还希望挂钩所有资源创建例程,并从调用中删除D3DPOOL_MANAGED标志,如果有人想要锁定它们,还可以选择添加D3DUSAGE_DYNAMIC。但是,这可能会导致另一组问题。在提供的MSDN链接中搜索“Direct3D 9和Direct3D 9Ex之间的差异”。