2017-08-14 106 views
0

基本上我想要做的就是迫使其采用了Direct3D9Ex背景(CreateD3D9Ex)但一个简单的“非恩”设备(IDirect3DDevice9)使用Direct3DDevice9Ex,而不是一个封闭源代码的应用程序是什么。 我在应用程序目录中放置了一个代理dll,它通常工作正常。现在我试图将CreateDevice的调用重定向到原始dll的CreateDeviceEx,然后返回一个“非ex”指针(以便应用程序在不知道它的情况下使用“Ex”设备)。队封闭源代码的应用程序使用Direct3DDevice9Ex代替非防爆设备的

根据我的理解,这应该工作,因为“Ex”设备实现了“非ex”设备也包含的所有方法 - 但显然必须有一些差异,因为只有隐藏的“Ex”设备正在使用的是光标。

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

背景

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

因此,我决定尝试创建共享深度/模板1级纹理,然后使用D3D10/D3D11方法访问此纹理,该方法实际上能够复制深度/模板表面。然而,只有D3D9Ex设备能够创建纹理与共享手柄...

附录

由于这样的事实Direct3D9Ex不支持管理池是不可能的。谢谢@VuVirt

回答

2

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

+0

好吧,我没有想到那一部分。那么,下一个方法的时间;)无论如何,谢谢。 – Apollo13