我尝试创建新的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)。
BUT!,实际上我在D3D11_CPU_ACCESS_READ
上设置了cpNewTexture
。请参阅下面的ntd和sd输出:
这里是ntd
和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
好,我现在似乎已经明白了...我以为您正在映射输出纹理(供阅读!),但您正在映射输入纹理。为什么?在我的防御很难从代码片段中读取执行流程。我是也很困惑为什么要使用
IDXGISurface::Map()
?你不似乎需要它。也许你应该解释一下自己是什么试图实现。您已经具有用作输入的纹理。是吗与D2D
兼容?如果是,请先使用它。不是,创建兼容并在那里复制输入纹理。您不需要地图对于两者之一。即使您确实想要Map,为什么选择
IDXGISurface::Map()
?您有适合访问的ID3D11DeviceContext::Map()
具有假定的纹理的纹理数据。我会说你不是应该完全做到IDXGISurface::Map()
。然后如果Map()
用于读取输出用于结束绘图,然后映射纹理或将其复制到mappable并映射第二个。
毕竟
您仍然不需要
Map()
。即使有可能,这条路Map()
和CreateBitmap()
显然是对性能的打击。 You could and should use other API instead. By using CreateSharedBitmap to create an ID2D1Bitmap from an IDXGISurface, you can write a Direct3D scene to a bitmap and render it with Direct2D。