Direct2D如何打开共享纹理

Direct2D how to open shared texture

我有一个代码,它使用 Direct9Ex,例如:

res = Device->CreateTexture(1920, 1080, 1, 1, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &Texture, &texture_shared_handle);

如何使用此 texture_shared_handle 打开该纹理以在 Direct2D 中读取?

我找到了函数 ID2D1RenderTarget::CreateSharedBitmap,但找不到任何可以打开共享 DXGI 资源的工作代码。另外,纹理对共享有效,它只有一层,A8R8G8B8 模式。 此外,我被迫使用 direct9ex 进行纹理创建

我想到的另一个解决方案是在与上面相同的设备(创建纹理)上使用共享句柄创建 Direct9Ex 表面,如下所示:

res = Device->CreateOffscreenPlainSurface(1920, 1080, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &MagSurface2, &Surface2_shared_handle);
res = Texture->GetSurfaceLevel(0, &MagSurface1);

...
// copying data from texture level surface to shared surface
res = Device->GetRenderTargetData(MagSurface1, MagSurface2);

但是,如何将这个 Surface2_shared_handle 传递给 Direct2D?

我也尝试获取 IDXGISurface 然后将其传递给 Direct2D,但是,我总是失败:

// Direct9Ex texture
IDXGISurface* pDxgiSurface = NULL;
            res = Texture->QueryInterface(__uuidof(IDXGISurface), (void**)&pDxgiSurface);
res is always E_NOINTERFACE!

谢谢

为了获得 IDXGISurface,您需要使用 this function 打开与您的 DirectX 11 设备(您用于初始化 Direct2D 的设备)共享的纹理。您可以调用它来获取一个 IDXGIResource,您可以为 IDXGISurface 查询接口并在 Direct2D 中使用它。 您可能还需要实施一些同步,例如 here.

中解释的同步