2

我正在调用这个方法:

http://msdn.microsoft.com/en-us/library/dd371264(VS.85).aspx

调用失败并显示E_NOINTERFACE。该文档对于为什么会发生这种情况尤其没有帮助。我已经启用了所有 DirectX 11 调试功能,这是我得到的最好的。我知道我有一个有效的IDXGISurface1*(也试过IDXGISurface)并且其他参数设置正确。关于为什么这个电话可能会失败的任何想法?

编辑:

我在创建 D3D11 设备时也遇到了问题。如果我在 D3D11CreateDeviceAndSwapChain 中将 nullptr 作为 IDXGIAdapter* 参数传递,它工作正常,但如果我自己枚举适配器并传入一个指针(唯一返回的),它会因参数无效而失败。MSDN 文档明确指出,如果传递了 nullptr,则系统使用 EnumAdapters1 的第一个返回值。我正在运行 DX11 系统。

4

2 回答 2

7

Direct2D 仅在您创建 Direct3D 10.1 设备时有效,但它可以与 Direct3D 11 共享表面。您需要做的就是创建这两个设备并将所有 Direct2D 内容呈现为您在它们之间共享的纹理。我在自己的应用程序中使用这种技术来将 Direct2D 与 Direct3D 11 一起使用。它会产生少量成本,但它很小且每帧恒定。

您需要使用的过程的基本大纲是:

  1. 像往常一样创建 Direct3D 11 设备。
  2. 使用 D3D10_RESOURCE_MISC_SHARED_KEYEDMUTEX 选项创建纹理,以允许访问 ID3D11KeyedMutex 接口。
  3. 使用GetSharedHandle获取可以在设备之间共享的纹理句柄。
  4. 创建 Direct3D 10.1 设备,确保它是在同一个适配器上创建的。
  5. 在 Direct3D 10.1 设备上使用 OpenSharedResource 函数获取 Direct3D 10.1 的纹理版本。
  6. 访问纹理的 D3D10 KeyedMutex 接口。
  7. 使用 Direct3D 10.1 版本的纹理创建使用 Direct2D 的 RenderTarget。
  8. 当您想使用 D2D 进行渲染时,请使用键控互斥锁来锁定 D3D10 设备的纹理。然后,在 D3D11 中获取它并渲染纹理,就像您可能已经尝试过的那样。

这不是微不足道的,但它运作良好,这是他们希望您在它们之间进行互操作的方式。Windows 8 看起来将引入完整的 D3D11 兼容性,因此它会像您期望的那样简单。

于 2012-01-30T22:41:08.190 回答
2

Direct2D 使用 D3D10 设备而不是 D3D11 设备。D3D11 设备可能被该 E_NOINTERFACE 报告为缺少接口。

于 2010-12-19T22:50:35.750 回答