ID3D11Texture2D转ID2D1Bitmap,可以吗?

问题描述 投票:0回答:4

我正在开发一款游戏的扩展,它只打开 HDC 供插件开发人员使用。

但是,我已经用尽了 GDI+/Direct2D 绘图的可能性,这些可能性对于我想要完成的任务来说足够快 - 图像效果(加法、混合、乘法混合等)。

我很清楚 Direct2D 提供了一个效果工具包,但是它需要平台更新(对于 Windows 7),而且这根本不理想。

因此我只剩下 Direct3D。 MSDN/Google 搜索提供了很多执行 D2D -> D3D 的方法,但 ZERO 展示了如何执行 D3D -> D2D。我知道有一种方法可以转换 D3D -> D2D,即映射和复制像素数据,但这效率非常低,因为(如果我是对的)它从 GPU VRAM -> CPU/RAM -> GPU VRAM 传输。我可能只会用它作为最后的选择......

或者,如果有人知道如何从 D3D11 中的 RenderTarget 获取 HDC,那么我也可以使用 BitBlt。

如果有人能提供帮助,我将不胜感激。

directx direct3d directx-11 direct2d dxgi
4个回答
3
投票

好吧,我明白了。可能不是最有效的,但可以完成工作。 没有 memcpy、bitblt (尽管内存中的 CreateBitmap 内部可能有这些函数)。也避免了所有 DXGI 版本的废话。

D3D11_TEXTURE2D_DESC td;
m_backBufferTexture->GetDesc(&td);
td.Usage = D3D11_USAGE_STAGING;
td.BindFlags = 0;
td.CPUAccessFlags = D3D11_CPU_ACCESS_READ;

m_pDevice->CreateTexture2D( &td, NULL, &(m_pNewTexture) );
m_pContext->CopyResource(m_pNewTexture, m_backBufferTexture);
m_pNewTexture->QueryInterface(__uuidof(IDXGISurface), (void**)&m_NewTextDXGI);

DXGI_MAPPED_RECT bitmap2Dmap;
m_NewTextDXGI->Map(&bitmap2Dmap,DXGI_MAP_READ);

D2D1_PIXEL_FORMAT desc2d;
D2D1_BITMAP_PROPERTIES bmpprops;

desc2d.format = DXGI_FORMAT_B8G8R8A8_UNORM;
desc2d.alphaMode = D2D1_ALPHA_MODE_IGNORE; // Adapt to your needs.      

bmpprops.dpiX = 96.0f;
bmpprops.dpiY = 96.0f;
bmpprops.pixelFormat = desc2d;


D2D1_SIZE_U size = D2D1::SizeU(
dim.x,
dim.y
); // Adapt to your own size.

pRT->CreateBitmap(size,(void*)bitmap2Dmap.pBits,bitmap2Dmap.Pitch,bmpprops,&m_pD2DBitmap);
m_NewTextDXGI->Unmap();

0
投票

查看Windows 图形 API 之间的表面共享

您可以重点关注Direct3D 10.1 与 Direct2D 的设备共享

部分

0
投票

您可以使用 ID2D1RenderTarget::CreateSharedBitmap 创建与

ID2D1Bitmap
共享表面的
IDXGISurface

引用:...您可以将

IDXGISurface
表面传递给
CreateSharedBitmap
方法,以与 Direct3D 共享视频内存并将 Direct3D 内容作为 ID2D1Bitmap 进行操作。


0
投票

这应该有效:

bool ConvertID3D11Texture2DToID2D1Bitmap(ID3D11DeviceContext* ctx, 
                                         ID3D11Texture2D* texture, 
                                         ID2D1Bitmap* bitmap)
{
      ComPtr<IDXGISurface> dxgiSurface;
      HRESULT hr = bitmap->GetSurface(&dxgiSurface);
      if (hr != S_OK)
           return false;
      ComPtr<ID3D11Resource> d3dResource;
      hr = dxgiSurface.As(&d3dResource);
      if (hr != S_OK)
           return false;
      ctx->CopyResource(d3dResource.Get(), texture);
}

所有工作都是在 GPU 上完成的。您应该确保纹理和位图具有相同的格式。

© www.soinside.com 2019 - 2024. All rights reserved.