透明SwapChainPanel(compositeMode) - 没有不透明的DirectX绘图?

时间:2015-08-18 10:12:51

标签: c++ windows-runtime directx uwp

我正在使用openCV在Windows 10(通用Windows应用程序/ WinRT)中制作增强现实应用程序(C ++)。

问题:

我希望有一个透明的SwapChainPanel背景,以使后面的内容(网络摄像头流)可见,但使用不透明的3D模型(例如锥形)。

尝试:

对于我的研究似乎,将SwapChainPanel的CompositeMode设置为“minBlend”应该这样做 - 是的,但我仍然希望我的3D对象不透明。事实上,我希望我的对象是半透明的,但始终可见。 “minBlend”模式更适用于文本突出显示,而不是真正用半透明模型覆盖某些内容(暗区未覆盖,请参见图片)。

Image: Standard DirectX Cube (oqaque background and model)

Image: DirectX Cube overlayed

你有什么建议吗?有可能吗?

背景

我正在使用openCV制作增强现实Windows 10应用程序。要获取我的网络摄像头流的当前像素数据,我使用Win10方法 mediaCapture-> GetPreviewFrameAsync(videoframe) SoftwareBitmap-> LockBuffer 来访问memorybuffer中的字节数。这些字节在openCV函数中处理,处理完成后,我正在设置一个WriteableBitmap,以在我的Xaml-UI元素中显示修改过的webcam-stream。由于已经有类绘制我的DirectX对象并使用触摸输入修改它们,我想使用DirectX将网络摄像头预览覆盖到我的对象。

很抱歉没有关联使用的方法和链接的图片,我的声誉不够

编辑:也许另一种方法是从我的像素数据创建纹理,并在我的swapchainpanel上设置一个全屏矩形作为背景。然后每一帧我都要更新纹理数据。

1 个答案:

答案 0 :(得分:0)

由于某些官方Windows Store示例,更改compositeMode是使swapChainPanel后面的Xaml内容可见的唯一解决方案。

但是这个解决方法最终有效:我创建了一个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);
}

首先,我正在使用此纹理绘制一个全屏矩形(带有DirectXTK的SpriteBatch)。之后我可以画任何其他东西。