【问题标题】:Force closed source application to use Direct3DDevice9Ex instead of non-Ex device强制闭源应用程序使用 Direct3DDevice9Ex 而不是非 Ex 设备
【发布时间】:2017-08-14 09:15:24
【问题描述】:

基本上,我想要做的是强制使用Direct3D9Ex 上下文(CreateD3D9Ex) 但简单的“非前”设备(IDirect3DDevice9) 的封闭源应用程序使用Direct3DDevice9Ex。 我在应用程序目录中放置了一个代理 dll,它通常可以正常工作。现在我试图将CreateDevice 的调用重定向到原始dll 的CreateDeviceEx,然后只返回一个“非ex”指针(这样应用程序就使用了一个“Ex”设备而不知道它)。

据我了解,这应该可行,因为“Ex”设备实现了“non-ex”设备还包含的所有方法 - 但显然必须有一些区别,因为如果隐藏的“Ex”设备唯一会被渲染正在使用的是光标。

问:谁能告诉我我做错了什么或给一些建议?

背景

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

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

附录

由于 Direct3D9Ex 不支持托管池,这是不可能的。谢谢@VuVirt

【问题讨论】:

    标签: c++ directx directx-9


    【解决方案1】:

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

    【讨论】:

    • 好吧,我没有考虑那部分。好吧,是时候采用下一种方法了;)还是谢谢。
    猜你喜欢
    • 2016-11-29
    • 2017-07-29
    • 1970-01-01
    • 2012-11-14
    • 1970-01-01
    • 2018-05-22
    • 1970-01-01
    • 2014-12-27
    • 1970-01-01
    相关资源
    最近更新 更多