2014-03-13 53 views
1

我正在開發一款遊戲的擴展,它只爲插件開發人員打開HDC。但是,我已經耗盡了GDI +/Direct2D繪圖的可能性,足以滿足我想要完成的任務 - 圖像效果(添加劑,混合,混合等)。ID3D11Texture2D到ID2D1Bitmap,可以嗎?

我很清楚,Direct2D提供了一個效果工具包,但需要平臺更新(對於Windows 7),這並不理想。

因此,我剩下只有Direct3D。 MSDN/Google搜索提供了很多方法來執行D2D - > D3D,但ZERO顯示瞭如何執行D3D - > D2D。我知道有一種方法可以轉換D3D - > D2D,也就是映射和複製像素數據,但效率非常低(如果我是對的話),它將從GPU VRAM - > CPU/RAM - > GPU VRAM傳輸。我可能只會使用它作爲最後的替代方案....

另外,它也可能工作,如果有人有任何想法如何從D3D11 RenderTarget抓住HDC,以便我可以BitBlt。

如果有人能幫到這個,我將不勝感激。

+0

不是很清楚你的問題,你想要什麼? – zdd

+0

將D3D的Backbuffer作爲ID3D11Texture2D捕獲並轉換爲ID2D1Bitmap發送給D2D,如果可能的話,如何做到這一點。希望它足夠清楚。 – user3416064

+0

您應該介紹一些關於業務邏輯的內容,您是否希望在D3D和D2D之間進行實時同步? – zdd

回答

2

確定我想通了。可能不是最有效率的,但做這項工作。 沒有memcpy,bitblt(儘管內存中的CreateBitmap內部可能有這些函數)。避免所有的DXGI版本垃圾。

D3D11_TEXTURE2D_DESC td; 
    m_backBufferTexture->GetDesc(&td); 
    td.Usage = D3D11_USAGE_STAGING; 
    td.BindFlags = 0; 
    td.CPUAccessFlags = D3D11_CPU_ACCESS_READ; 

    m_pDevice->CreateTexture2D(&td, NULL, &(m_pNewTexture)); 
    m_pContext->CopyResource(m_pNewTexture, m_backBufferTexture); 
    m_pNewTexture->QueryInterface(__uuidof(IDXGISurface), (void**)&m_NewTextDXGI); 

    DXGI_MAPPED_RECT bitmap2Dmap; 
    m_NewTextDXGI->Map(&bitmap2Dmap,DXGI_MAP_READ); 

    D2D1_PIXEL_FORMAT desc2d; 
    D2D1_BITMAP_PROPERTIES bmpprops; 

    desc2d.format = DXGI_FORMAT_B8G8R8A8_UNORM; 
    desc2d.alphaMode = D2D1_ALPHA_MODE_IGNORE; // Adapt to your needs.  

    bmpprops.dpiX = 96.0f; 
    bmpprops.dpiY = 96.0f; 
    bmpprops.pixelFormat = desc2d; 


    D2D1_SIZE_U size = D2D1::SizeU(
    dim.x, 
    dim.y 
    ); // Adapt to your own size. 

    pRT->CreateBitmap(size,(void*)bitmap2Dmap.pBits,bitmap2Dmap.Pitch,bmpprops,&m_pD2DBitmap); 
    m_NewTextDXGI->Unmap(); 
0

您可以使用ID2D1RenderTarget::CreateSharedBitmap創建ID2D1Bitmap共享表面的IDXGISurface

Quote:...您可以將IDXGISurface表面傳遞給CreateSharedBitmap方法以與Direct3D共享視頻內存,並將Direct3D內容作爲ID2D1Bitmap進行操作。