从DirectX11到Directx9共享资源

Share Resource from DirectX11 to Directx9

本文关键字:共享资源 Directx9 DirectX11      更新时间:2023-10-16

let,我有两个设备,第一个是DirectX9,第二个是DirectX11。我正在做的是计算粒子,并通过D3D11的计算着色器将它们的数据保存在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_R16B16A16_FLOAT创建纹理时,它起作用了。而使用D3DFMT_A32B32G32R32F和DXGI_FORMAT_R32B32A32_FLOAT则给出了上述错误。

由于不允许使用这些纹理格式,因此会出现此错误。

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

  • 纹理必须是2D
  • 只允许1 mip级别
  • 纹理必须具有默认用途
  • 纹理必须是只读的
  • 不允许使用MSAA纹理
  • 绑定标志必须设置SHADER_RESOURCE和RENDER_TARGET
  • 仅允许R10G10B10A2_UNORM、R16G16B16A16_FLOAT和R8G8B8_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