将资源从DirectX11共享到Directx9

时间:2012-03-29 11:28:17

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

让我有两个设备,第一个是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_R16G16B16A16_FLOAT创建纹理时,它有效。但是使用D3DFMT_A32B32G32R32F和DXGI_FORMAT_R32G32B32A32_FLOAT时,会出现上述错误。

1 个答案:

答案 0 :(得分:3)

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

  

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

     
      
  • 纹理必须是2D
  •   
  • 仅允许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