【问题标题】:D3D11 SwapChain Buffer is NULLD3D11 SwapChain 缓冲区为 NULL
【发布时间】: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


【解决方案1】:

交换链的代码给出了答案...交换链是使用 4x MSAA 创建的,但暂存纹理是单样本的。

在这种情况下你不能CopyResource。相反,您必须解决 MSAA:

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

请参阅 DirectX Tool Kit ScreenGrab 源,它更普遍地处理这种情况。

代码还显示您没有使用调试设备 (D3D11_CREATE_DEVICE_DEBUG),它会告诉您此问题。详情请见this blog post

【讨论】:

  • 非常感谢您的帮助!我欠你一蒲式耳苹果
  • @Chuck Walbourn 你对一份好工作感兴趣吗?抱歉在这里写,我找不到任何其他联系方式..
猜你喜欢
  • 2022-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-10
  • 2013-10-25
  • 2021-01-14
相关资源
最近更新 更多