2010-12-19 16 views
1

我調用這個方法:無法創建Direct2D的DXGI表面

http://msdn.microsoft.com/en-us/library/dd371264(VS.85).aspx

的調用失敗E_NOINTERFACE。這些文檔對於這可能發生的原因特別沒有幫助。我已經啓用了所有的DirectX 11調試工具,這是我得到的最好的。我知道我有一個有效的IDXGISurface1*(也試過IDXGISurface),其他參數設置正確。關於爲什麼這個電話可能會失敗的任何想法?

編輯:

我也在創建D3D11設備時遇到問題。如果我在D3D11CreateDeviceAndSwapChain中以IDXGIAdapter *參數的形式傳遞nullptr,它可以正常工作,但是如果我自己枚舉適配器並傳入一個指針(唯一返回的指針),它將失敗,並返回無效參數。 MSDN文檔明確指出,如果傳遞nullptr,那麼系統將使用EnumAdapters1中的第一個返回值。我正在運行DX11系統。

回答

2

Direct2D使用D3D10設備而非D3D11設備。 D3D11設備可能是由於缺少E_NOINTERFACE接口而報告的。當你創建一個Direct3D 10.1裝置

+0

'http://msdn.microsoft.com/en-us/library/ee913554(VS.85).aspx'說任何DXGI1.1技術,包括DX11,都可以共享曲面。 – Puppy 2010-12-19 23:05:47

+0

有你描述的麻煩。請見:http://www.gamedev.net/community/forums/topic.asp?topic_id = 547920 – 2010-12-19 23:14:15

+0

該死的。所以D3D11接口不能渲染它自己的文本,也不能與D2D互操作。這太好了。 – Puppy 2010-12-20 00:22:16

6

的Direct2D只適用,但它能與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兼容性,所以它會像您期望的那樣簡單。

+1

它很棒!我不得不使用OpenSharedResource1()。另外,當我不正確地使用AcquireSync()時,共享紋理是黑色的。因此,使用具有適當參數的AcquireSync()/ ReleaseSync()非常重要,否則最終可能會認爲紋理的內容只是黑色。 – 2014-06-29 17:41:59