c++11 - 无法创建 Direct2D DXGI 表面

我正在调用这个方法:

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 系统。

最佳答案

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

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

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

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

https://stackoverflow.com/questions/4485265/

相关文章:

sql-server - SQL 服务器 2008 : how does NOLOCK works

ruby-on-rails - Ruby on Rails 究竟是什么?

php - 可以使用 PHP ImageMagick 获得透明渐变吗?

php - 如何在 PHP 中使用 substr_count() 计算空格

opengl - 如何让鼠标光标在 opengl/glut 中消失?

variables - Lua:为什么改变一个变量的值也会改变另一个变量的值?

opengl - 如何将 "clear color"插入属性堆栈

google-chrome - chrome.tabs 问题与 chrome.tabs.update

hsqldb - 使用序列将 Liquibase 数据加载到 HSQLDB

php - 如何在任何给定日期之前获得本周的周末?