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.
中解释的同步
我有一个代码,它使用 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.
中解释的同步