D3D11交换链缓冲区为NULL

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

[每当我运行此代码时,_TextureData结构中指向的数据(成员pData)都为0(例如300个字节,仅为0)。它返回的HRESULT result始终为S_OK,并且行和列的深度是准确的。我确定某些东西正在渲染到缓冲区中,因为有些东西正在显示在我渲染到的窗口上。我尝试过在呈现前后都获取缓冲区的数据,无论哪种方式,数据仍然为空。

D3D11_TEXTURE2D_DESC desc { };
ID3D11Texture2D * pCopy = nullptr;
ID3D11Texture2D * pBackBufferTexture = nullptr;
desc.Width = 800;
desc.Height = 800;
desc.MipLevels = 1;
desc.ArraySize = 1;
desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
desc.SampleDesc.Count = 1;
desc.Usage = D3D11_USAGE_STAGING;
desc.BindFlags = 0;
desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ;
desc.MiscFlags = 0;

assert( SUCCEEDED( pSwapChain->Present( 0,
                                        0 ) ) );
pDevice->CreateTexture2D( &desc, nullptr, &pCopy );
pSwapChain->GetBuffer( 0,
                       __uuidof( ID3D11Texture2D ),
                       reinterpret_cast< void ** >( &pBackBufferTexture ) );
pContext->CopyResource( pCopy, pBackBufferTexture );
D3D11_MAPPED_SUBRESOURCE _TextureData { };
auto result = pContext->Map( pCopy, 0, D3D11_MAP_READ, 0, &_TextureData );
pContext->Unmap( pCopy, 0 );
pCopy->Release( );
c++ directx direct3d direct3d11
1个回答
1
投票

交换链的代码包含答案...交换链是使用4倍MSAA创建的,但是暂存纹理是单样本。

在这种情况下,您无法CopyResource。相反,您必须解决MSAA:

pContext->ResolveSubresource(pCopy, 0, pBackBufferTexture, 0, DXGI_FORMAT_R8G8B8A8_UNORM);

请参见DirectX工具套件 ScreenGrab源,它更通常地处理这种情况。

代码还显示您没有使用调试设备(D3D11_CREATE_DEVICE_DEBUG),该设备会告诉您有关此问题的信息。有关详细信息,请参见this blog post

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