2012-03-29 77 views
1

讓,我有兩個裝置,首先是DirectX9的的和第二是DirectX11的的。 我正在做的是通過D3D11的Compute Shader計算粒子並將它們的數據保存在D3D11紋理中,然後我想在D3D9設備中使用D3D11紋理來顯示它。 我使用以下代碼..資源共享與從的DirectX11到DIRECTX9

在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:(錯誤):打開和創建的資源不匹配,無法打開共享資源。「

EDITED:好的,當我使用dx9中的D3DFMT_A16B16G16R16F和dX11中的DXGI_FORMAT_R16G16B16A16_FLOAT創建紋理時,它工作正常。但使用D3DFMT_A32B32G32R32F和DXGI_FORMAT_R32G32B32A32_FLOAT時,會出現上述錯誤。

回答

3

你得到的錯誤,因爲這些紋理格式是不允許的。

紋理正從D3D9共享到D3D11具有下列限制:

  • 紋理必須是2D
  • 只有1個mip級別允許
  • 紋理必須具有預設使用
  • 紋理絕可以只寫
  • MSAA紋理不準
  • 斌d標誌必須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

+1

抱歉,但即使R16G16B16A16_FLOAT不能正常工作,我是wrong.I認爲它不工作的功能,因爲大多數其他論壇中的帖子中說,它。任何人都有它的工作? – YAHOOOOO 2012-04-02 05:12:41

+1

問題是,雖然它是一種有效的共享格式,但在Direct3D9中不能有64位backbuffer。 – 2012-04-02 20:58:59