2015-08-18 52 views
0

我使用openCV在Windows 10(通用Windows應用程序/ WinRT)中製作增強現實應用程序(C++)。透明SwapChainPanel(compositeMode) - 不透明的DirectX繪圖?

問題:

我希望有一個透明背景SwapChainPanel使後面(攝像頭流)可見的內容,但不透明的3D模型(如濃)。

嘗試:

我的研究看來,在設定SwapChainPanel的CompositeMode爲「minBlend」應該這樣做 - 是的,但我還是希望我的3D對象是不透明的。事實上,我希望我的物品是半透明的,但始終可見。 「minBlend」模式更適用於文本高亮顯示,而不是真正用半透明模型覆蓋某些內容(黑色區域不覆蓋,請參閱圖片)。

Image: Standard DirectX Cube (oqaque background and model)

Image: DirectX Cube overlayed

你有什麼建議嗎?可能嗎?

背景:

我在做一個增強現實的Windows 10應用程序與OpenCV的。爲了獲取我的攝像頭流的當前像素數據,我使用了Win10方法mediaCapture-> GetPreviewFrameAsync(videoframe)SoftwareBitmap-> LockBuffer獲得對存儲緩衝區中的字節的訪問權限。這些字節在openCV函數中處理,處理完成後,我將設置一個WriteableBitmap,以在我的Xaml-UI元素中顯示修改的webcam-stream。由於已經有類來繪製我的DirectX對象並使用觸摸輸入修改它們,我想使用DirectX將網絡攝像頭預覽與我的對象疊加在一起。

對不起,不鏈接使用的方法和鏈接的圖像,我沒有足夠的聲譽

編輯:可能的替代是創建從我的像素數據的紋理,併成立了全屏在我的swapchainpanel上用作背景的矩形。然後每一幀我都要更新紋理數據。

回答

0

由於一些官方的Windows應用商店示例,更改compositeMode是使XAML內容可見在swapChainPanel背後的唯一解決方案。

但這種解決辦法最終的作品:我已經創建了一個Texture2D和更新包含數據的每一幀:

/*----- Update background texture with new videoframe -----*/ 

// image = openCV cv::Mat containing the pixeldata of the current frame 
if (image.data != nullptr) 
{ 
    D3D11_MAPPED_SUBRESOURCE mappedResource; 
    ZeroMemory(&mappedResource, sizeof(D3D11_MAPPED_SUBRESOURCE)); 

    // Disable GPU access to data. 
    auto m_d3dContext = m_deviceResources->GetD3DDeviceContext(); 
    m_d3dContext->Map(m_pTexture, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource); 
    // Update texture 
    memcpy(mappedResource.pData, image.data, 4*image.rows*image.cols); 
    // Reenable GPU access to data. 
    m_d3dContext->Unmap(m_pTexture, 0); 
} 

起初我畫一個矩形全屏(SpriteBatch與DirectXTK)與此紋理。之後我可以畫任何東西。