DirectX 中的色键

ChromaKey in DirectX

我需要使用 Direct2d 实现一些色度键功能。

我有一些来自 MSDN 的代码示例:

ComPtr<ID2D1Effect> chromakeyEffect;
m_d2dContext->CreateEffect(CLSID_D2D1ChromaKey, &chromakeyEffect);

chromakeyEffect->SetInput(0, bitmap);
chromaKeyEffect->SetValue(D2D1_CHROMAKEY_PROP_COLOR, {0.0f, 1.0f, 0.0f, 0.0f});
chromakeyEffect->SetValue(D2D1_CHROMAKEY_PROP_TOLERANCE, 0.2f);
chromakeyEffect->SetValue(D2D1_CHROMAKEY_PROP_INVERT_ALPHA, false);
chromakeyEffect->SetValue(D2D1_CHROMAKEY_PROP_FEATHER, false);

m_d2dContext->BeginDraw();
m_d2dContext->DrawImage(chromakeyEffect.Get());
m_d2dContext->EndDraw();

不过,我对 WinAPI 有点陌生。
我们的平台具有 ID3D11Device 的 yield 实例功能,我收到 DX11Texture 作为输入。
我有两个问题:
1.如何从ID3D11Device得到m_d2dContext?
2. 如何从DX11Texture得到ID2D1Image?

  1. How can I get m_d2dContext from ID3D11Device?

你不能,至少不能直接。

您创建了一个 D2D 工厂,并从那里在 DXGI 资源之上创建了一个渲染目标,该资源又派生自特定的 D3D11 纹理,因此属于特定的 D3D11 设备。结合所有这些,您可以使用 D2D 绘制特定的 D3D11 纹理。

  1. How can I get ID2D1Image from DX11Texture?

您案例的 MSDN 文档入口点是:Direct2D and Direct3D Interoperability Overview。特别针对 D3D 纹理到 D2D 图像的场景,建议的路径是这样的:

There are two primary ways to use Direct2D and Direct3D together:

[...]

By using CreateSharedBitmap to create an ID2D1Bitmap from an IDXGISurface, you can write a Direct3D scene to a bitmap and render it with Direct2D.