首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将CPU内存(UCHAR缓冲区)带入GPU内存(ID3D11Texture2D资源)

如何将CPU内存(UCHAR缓冲区)带入GPU内存(ID3D11Texture2D资源)
EN

Stack Overflow用户
提问于 2017-11-16 19:16:22
回答 1查看 392关注 0票数 1

这里的代码将在图形处理器上运行并捕获窗口屏幕,它为我们提供了ID3D11Texture2D资源。使用ID3D11DeviceContext::Map I将图形处理器的resourceBYTE缓冲区带到BYTE缓冲区中,并将其作为g_iMageBufferUCHAR

现在我想做逆向工程,我想把g_iMageBuffer缓冲区(中央处理器内存)放到ID3D11Texture2D(图形处理器内存)中。请有人帮助我如何做这个逆向工程,我对图形部分是新的。

代码语言:javascript
复制
//Variable Declaration
IDXGIOutputDuplication* IDeskDupl;
IDXGIResource*          lDesktopResource = nullptr;
DXGI_OUTDUPL_FRAME_INFO IFrameInfo;
ID3D11Texture2D*        IAcquiredDesktopImage;
ID3D11Texture2D*        lDestImage;
ID3D11DeviceContext*    lImmediateContext;
UCHAR*                  g_iMageBuffer=nullptr;

//Screen capture start here
hr = lDeskDupl->AcquireNextFrame(20, &lFrameInfo, &lDesktopResource);

// >QueryInterface for ID3D11Texture2D
hr = lDesktopResource->QueryInterface(IID_PPV_ARGS(&lAcquiredDesktopImage));
lDesktopResource.Release();

// Copy image into GDI drawing texture
lImmediateContext->CopyResource(lDestImage,lAcquiredDesktopImage);
lAcquiredDesktopImage.Release();
lDeskDupl->ReleaseFrame();  

// Copy GPU Resource to CPU
D3D11_TEXTURE2D_DESC desc;
lDestImage->GetDesc(&desc);
D3D11_MAPPED_SUBRESOURCE resource;
UINT subresource = D3D11CalcSubresource(0, 0, 0);
lImmediateContext->Map(lDestImage, subresource, D3D11_MAP_READ_WRITE, 0, &resource);

std::unique_ptr<BYTE> pBuf(new BYTE[resource.RowPitch*desc.Height]);
UINT lBmpRowPitch = lOutputDuplDesc.ModeDesc.Width * 4;
BYTE* sptr = reinterpret_cast<BYTE*>(resource.pData);
BYTE* dptr = pBuf.get() + resource.RowPitch*desc.Height - lBmpRowPitch;
UINT lRowPitch = std::min<UINT>(lBmpRowPitch, resource.RowPitch);

for (size_t h = 0; h < lOutputDuplDesc.ModeDesc.Height; ++h)
{
    memcpy_s(dptr, lBmpRowPitch, sptr, lRowPitch);
    sptr += resource.RowPitch;
    dptr -= lBmpRowPitch;
}

lImmediateContext->Unmap(lDestImage, subresource);
long g_captureSize=lRowPitch*desc.Height;
g_iMageBuffer= new UCHAR[g_captureSize];
g_iMageBuffer = (UCHAR*)malloc(g_captureSize);

//Copying to UCHAR buffer 
memcpy(g_iMageBuffer,pBuf,g_captureSize);
EN

回答 1

Stack Overflow用户

发布于 2017-11-17 00:55:47

你不需要逆向工程。你所描述的叫做“加载纹理”。

How to: Initialize a Texture Programmatically

How to: Initialize a Texture From a File

由于您似乎是DirectX编程的新手,因此可以考虑使用DirectX Tool Kit for DX11 tutorials。特别是,请确保您阅读了关于ComPtrThrowIfFailed的部分。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47328286

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档