【问题标题】:Share Resource from DirectX11 to Directx9从 DirectX11 共享资源到 Directx9
【发布时间】:2012-03-29 11:28:16
【问题描述】:

让,我有两个设备,第一个是 DirectX9,第二个是 DirectX11。 我正在做的是通过 D3D11 的 Compute Shader 计算粒子并将它们的数据保存在 D3D11 纹理中,然后我想在我的 D3D9 设备中使用该 D3D11 纹理来显示它。 我正在使用以下代码..

在 D3D11 设备中..(m_pBuffer 为 ID3D11Buffer )

 IDXGIResource* pTempResource(NULL);
 hr = m_pBuffer->QueryInterface( __uuidof(IDXGIResource), (void**)&pTempResource );
 hr = pTempResource->GetSharedHandle(&SharedHandle); //successful

然后在 D3D9 设备中...

hr = g_pd3dDevice->CreateTexture(width, height, 1, D3DUSAGE_RENDERTARGET,D3DFMT_A32B32G32R32F,D3DPOOL_DEFAULT,&pSharedTexture9,&SharedHandle);

我遇到的错误是“Direct3D9:(错误):打开和创建的资源不匹配,无法打开共享资源。”

已编辑:好的,当我使用 dx9 中的 D3DFMT_A16B16G16R16F 和 dX11 中的 DXGI_FORMAT_R16G16B16A16_FLOAT 创建纹理时,它起作用了。但是使用 D3DFMT_A32B32G32R32F 和 DXGI_FORMAT_R32G32B32A32_FLOAT 会出现上述错误。

【问题讨论】:

    标签: c++ directx directx-9 directx-11


    【解决方案1】:

    您收到该错误是因为不允许使用这些纹理格式。

    从 D3D9 共享到 D3D11 的纹理具有以下限制:

    • 纹理必须是二维的
    • 只允许 1 个 mip 级别
    • 纹理必须具有默认用法
    • 纹理只能写
    • 不允许使用 MSAA 纹理
    • 绑定标志必须设置 SHADER_RESOURCE 和 RENDER_TARGET
    • 仅允许使用 R10G10B10A2_UNORM、R16G16B16A16_FLOAT 和 R8G8B8A8_UNORM 格式

    来自http://msdn.microsoft.com/en-us/library/windows/desktop/ff476531%28v=vs.85%29.aspx

    因此,对于共享纹理,您仅限于上述三种格式。此外,如果您打算在 Direct3D9 中将纹理用作后缓冲区,则进一步限制为 R8G8B8A8_UNORM 和 R10G10B10A2_UNORM。来源:http://msdn.microsoft.com/en-us/library/windows/desktop/bb172558%28v=vs.85%29.aspx#BackBuffer_or_Display_Formats

    【讨论】:

    • 抱歉,即使 R16G16B16A16_FLOAT 也不起作用,我错了。我认为它是一个不起作用的功能,正如其他论坛上的大多数帖子所说的那样。有人搞定了吗?
    • 问题在于,虽然它是一种有效的共享格式,但在 Direct3D9 中不能有 64 位后备缓冲区。
    猜你喜欢
    • 2014-03-29
    • 2023-03-10
    • 2021-10-10
    • 2015-10-27
    • 1970-01-01
    • 2022-12-12
    • 2011-08-17
    • 2015-06-07
    • 2020-05-17
    相关资源
    最近更新 更多