【发布时间】:2020-04-09 02:31:14
【问题描述】:
每当我运行此代码时,在 _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( );
【问题讨论】:
-
在
Present之后,您绘制的任何场景都被“翻转”,因此该点之后的后台缓冲区是 NEXT 帧,而不是 LAST 帧。 -
我在展示前后都试过获取它,两次数据都是空的。
-
这里有很多点你可以得到你没有检查的失败,所以我不知道到底是什么问题。也就是说,如果您想要做的基本上是“屏幕截图”捕获,请参阅ScreenGrab。
-
您似乎对暂存资源中后备缓冲区的大小和格式做出了假设。你应该仔细检查一下。
-
您应该发布用于创建交换链的代码以及读取大小的代码。现在我只是在盲目猜测
标签: c++ directx direct3d direct3d11