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如何打开共享纹理的主要内容,如果未能解决你的问题,请参考以下文章

如何在片段着色器中平铺部分纹理

片段着色器究竟如何用于纹理?

如何将浮点矩阵作为 2D 纹理传递给片段着色器?

在片段着色器中丢失纹理定义

纹理中的 OpenGL 片段着色器

片段着色器中未使用纹理数据 - OpenGL