基本上我想做的是强制使用Direct3D9Ex
上下文(CreateD3D9Ex)
但使用简单的"非ex"设备(IDirect3DDevice9)
代替使用Direct3DDevice9Ex
。
我在应用程序目录中放置了一个代理DLL,这通常可以正常工作。现在,我正在尝试将CreateDevice
的来电重定向到原来的dll' CreateDeviceEx
,然后返回一个"非前"指针(以便应用程序使用" Ex"设备而不知道它)。
根据我的理解,这应该有效,因为" Ex"设备实现了所有方法" non-ex"设备还包含 - 但显然必须有一些区别,因为唯一的东西,如果隐藏的" Ex"设备正在使用的是光标。
问:有人可以告诉我我做错了什么或给出一些建议吗?
背景
我正在使用我要复制深度缓冲区的D3D9
应用程序。不幸的是,它的格式是D24S8
,这意味着直接拷贝是不可能的。
所以我决定尝试是否可以创建共享的深度/模板1级纹理,然后使用实际上能够复制深度/模板表面的D3D10/D3D11
方法访问此纹理。但是,只有D3D9Ex
设备能够使用共享句柄创建纹理...
附录
由于Direct3D9Ex不支持托管池,因此无法实现。谢谢@VuVirt
答案 0 :(得分:2)
我认为问题主要是由于D3D9Ex设备不支持D3DPOOL_MANAGED资源。这就是为什么你没有在屏幕上看到任何渲染的原因。使用D3DPOOL_MANAGED创建资源实际上会失败。您可能还希望挂钩所有资源创建例程,并从调用中删除D3DPOOL_MANAGED标志,如果有人想要锁定它们,还可以选择添加D3DUSAGE_DYNAMIC。但是,这可能会导致另一组问题。在提供的MSDN链接中搜索“Direct3D 9和Direct3D 9Ex之间的差异”。