Direct2D如何打开共享纹理
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Direct2D如何打开共享纹理相关的知识,希望对你有一定的参考价值。
我有一个使用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的InterInterface并在Direct2D中使用它。您可能还需要实现一些同步,例如解释为here的同步。
以上是关于Direct2D如何打开共享纹理的主要内容,如果未能解决你的问题,请参考以下文章