【问题标题】:Can't create Direct2D DXGI Surface无法创建 Direct2D DXGI Surface
【发布时间】:2010-12-19 21:39:18
【问题描述】:

我正在调用这个方法:

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

【问题讨论】:

    标签: c++11 direct2d directx-11


    【解决方案1】:

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

    【讨论】:

    • 效果很好!我不得不使用 OpenSharedResource1()。此外,当我不正确地使用 AcquireSync() 时,共享纹理是黑色的。因此,使用带有适当参数的 AcquireSync()/ReleaseSync() 非常重要,否则您最终可能会认为纹理的内容只是黑色。
    【解决方案2】:

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

    【讨论】:

    • http://msdn.microsoft.com/en-us/library/ee913554(VS.85).aspx 表示任何 DXGI1.1 技术,包括 DX11,都可以共享表面。
    • 该死的。所以 D3D11 接口不能呈现它自己的文本,也不能与 D2D 互操作。太好了。
    猜你喜欢
    • 2019-05-07
    • 1970-01-01
    • 2016-04-23
    • 2016-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-13
    • 1970-01-01
    相关资源
    最近更新 更多