2015-08-18 50 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)与此纹理。之后我可以画任何东西。