0

我尝试创建新ID3D11Texture2D的以将其映射到DXGI_MAPPED_RECT进一步。我收到了一些ID3D11Texture2D我没有电源的东西(不能改变创建方式)。

这是代码的一部分:

CComPtr<IDXGIResource> cpDXGIResource;
RET_HR_NULL(_pTexIn->QueryInterface(__uuidof(IDXGIResource), (void**)&cpDXGIResource), cpDXGIResource);

HANDLE sharedHandle;
cpDXGIResource->GetSharedHandle(&sharedHandle);

CComPtr<ID3D11Texture2D> cpTexIn;
cpD3D11Device->OpenSharedResource(sharedHandle, __uuidof(ID3D11Resource), (void**)(&cpTexIn));

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

CComPtr<ID3D11Texture2D> cpNewTexture;
RET_HR_NULL(cpD3D11Device->CreateTexture2D(&td, NULL, &cpNewTexture), cpNewTexture);

cpD3D11DeviceContext->CopyResource(cpNewTexture, cpTexIn);

CComPtr<IDXGISurface> cpDXGISurface;
RET_HR_NULL(cpNewTexture->QueryInterface(&cpDXGISurface), cpDXGISurface);

D3D11_TEXTURE2D_DESC ntd;
cpNewTexture->GetDesc(&ntd);

DXGI_SURFACE_DESC sd;
cpDXGISurface->GetDesc(&sd);

DXGI_MAPPED_RECT bitmap2Dmap;
RET_HR(cpDXGISurface->Map(&bitmap2Dmap, DXGI_MAP_READ));

_pTexIn是一个输入 ID3D11Texture2D。我收到以下错误,而Map()

RET_HR(cpDXGISurface->Map(&bitmap2Dmap, DXGI_MAP_READ));

DXGI 错误:IDXGISurface::Map:此对象不是使用允许 CPU 访问的 CPUAccess 标志创建的。[其他错误 #42:] 在 testhost.x86.exe 中的 0x76734192 处引发异常:Microsoft C++ 异常:_com_error 在内存位置 0x0716E134。线程 0x26bc 以代码 0 (0x0) 退出。

但!,其实我已经D3D11_CPU_ACCESS_READ设置好了cpNewTexture。请参阅下面的 ntd 和 sd 的输出:

这是ntdand的内容sd

ntd {Width=0x00000354 Height=0x000001e0 MipLevels=0x00000001 ...}   D3D11_TEXTURE2D_DESC
    Width   0x00000354  unsigned int
    Height  0x000001e0  unsigned int
    MipLevels   0x00000001  unsigned int
    ArraySize   0x00000001  unsigned int
    Format  DXGI_FORMAT_B8G8R8A8_UNORM (0x00000057) DXGI_FORMAT
    SampleDesc  {Count=0x00000001 Quality=0x00000000 }  DXGI_SAMPLE_DESC
    Usage   D3D11_USAGE_DEFAULT (0x00000000)    D3D11_USAGE
    BindFlags   0x00000008  unsigned int
    CPUAccessFlags  0x00020000  unsigned int
    MiscFlags   0x00000002  unsigned int


sd  {Width=0x00000354 Height=0x000001e0 Format=DXGI_FORMAT_B8G8R8A8_UNORM (0x00000057) ...} DXGI_SURFACE_DESC
    Width   0x00000354  unsigned int
    Height  0x000001e0  unsigned int
    Format  DXGI_FORMAT_B8G8R8A8_UNORM (0x00000057) DXGI_FORMAT
    SampleDesc  {Count=0x00000001 Quality=0x00000000 }  DXGI_SAMPLE_DESC
4

1 回答 1

0

好的,在主要问题中, 罗马给出了以下解释:

好的,我现在似乎明白了......我以为你正在映射输出纹理(用于阅读!)但你正在映射输入纹理。为什么?在我的辩护中,执行流程很难从片段中读取。我也很困惑你为什么要使用IDXGISurface::Map()?你似乎不需要它。也许您应该向自己解释您要达到的目标。您已经有一个用作输入的纹理。它兼容D2D吗?如果是,请先进一步使用它。如果不是,请在此处创建兼容并复制输入纹理。两者中的任何一个都不需要 Map 。

即使您确实想要地图,为什么IDXGISurface::Map()?您拥有ID3D11DeviceContext::Map()适合使用假定此的纹理访问纹理数据的方法。我会说你根本不应该这样做IDXGISurface::Map()。然后,如果Map()要读取输出,则结束绘图,然后映射纹理或将其复制到可映射并映射第二个。

毕竟

Map()反正你不需要。尽管这是可能的,但这条路径 Map()显然CreateBitmap()会对性能造成影响。您可以而且应该使用其他 API。通过使用 CreateSharedBitmap 从 IDXGISurface 创建 ID2D1Bitmap,您可以将 Direct3D 场景写入位图并使用 Direct2D 渲染它

于 2020-03-16T16:57:50.693 回答