无法创建Direct2D DXGI Surface

Pup*_*ppy 1 directx-11 direct2d c++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系统.

zhu*_*SFT 6

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兼容性,因此它会像您期望的那样简单.