无法创建Direct2D DXGI Surface

时间:2010-12-19 21:39:19

标签: c++11 direct2d directx-11

我正在调用这种方法:

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

呼叫失败,E_NOINTERFACE。文档对于为什么会发生这种情况特别无益。我启用了所有DirectX 11调试的东西,这是我得到的最好的。我知道我有一个有效的IDXGISurface1*(也尝试了IDXGISurface),其他参数设置正确。关于为什么这个电话会失败的任何想法?

编辑:

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

2 个答案:

答案 0 :(得分:6)

Direct2D仅在您创建Direct3D 10.1设备时有效,但可以与Direct3D 11共享曲面。您需要做的就是创建两个设备并将所有Direct2D内容渲染到纹理你在他们之间分享。我在我自己的应用程序中使用这种技术将Direct2D与Direct3D一起使用。它会产生一些成本,但每帧很小且不变。

您需要使用的流程的基本概要是:

  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中获取它并渲染您可能已经尝试过的纹理。
  9. 这不是微不足道的,但它运作良好,而且它们是他们希望您在它们之间进行互操作的方式。 Windows 8看起来会引入完整的D3D11兼容性,所以它会像你期望的一样简单。

答案 1 :(得分:2)

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