Direct2D如何打开共享纹理

时间:2019-10-12 00:10:01

标签: c++ directx direct3d direct2d direct3d9

我有一个使用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!

谢谢

1 个答案:

答案 0 :(得分:2)

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

相关问题