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

Transparent SwapChainPanel (compositeMode) - no opaque DirectX drawing?

我正在使用 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 来访问内存缓冲区中的字节。字节在 openCV 函数中处理,处理完成后,我正在设置一个 WriteableBitmap 以在我的 Xaml-UI 元素中显示修改后的网络摄像头流。由于已经 类 绘制我的 DirectX 对象并通过触摸输入修改它们,我想使用 DirectX 将网络摄像头预览与我的对象叠加。

不好意思没把用过的方法和链接的图片联系起来,信誉不够

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

由于一些官方 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 with DirectXTK)。之后我就可以画别的东西了。