visual-c++ - 为什么只需要 1 个深度/模板缓冲区,即使交换链是三重缓冲的 DirectX 12

标签 visual-c++ directx depth-buffer directx-12 double-buffering

我正在学习 DirectX12 编程。让我感到困惑的一件事是,在我阅读的所有教程中,即使在交换链中使用三重/双缓冲时,它们也只创建一个深度/模板缓冲区。难道你不需要为每一帧都有一个深度/模板缓冲区吗?

有问题的代码:

            D3D12_DESCRIPTOR_HEAP_DESC dsvHeapDesc = {};
            dsvHeapDesc.NumDescriptors = 1; //why only 1?
            dsvHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_DSV;
            dsvHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_NONE;
            if(FAILED(device->CreateDescriptorHeap(&dsvHeapDesc, IID_PPV_ARGS(&dsDescriptorHeap))))
            {
                MessageBoxW(NULL, L"Failed to create depth buffer descriptor heap!", L"Error", MB_OK | MB_ICONERROR);
                return -1;
            }
            D3D12_DEPTH_STENCIL_VIEW_DESC depthStencilDesc = {};
            depthStencilDesc.Format = DXGI_FORMAT_D32_FLOAT;
            depthStencilDesc.ViewDimension = D3D12_DSV_DIMENSION_TEXTURE2D;
            depthStencilDesc.Flags = D3D12_DSV_FLAG_NONE;

            D3D12_CLEAR_VALUE depthOptimizedClearValue = {};
            depthOptimizedClearValue.Format = DXGI_FORMAT_D32_FLOAT;
            depthOptimizedClearValue.DepthStencil.Depth = 1.0f;
            depthOptimizedClearValue.DepthStencil.Stencil = 0;

            device->CreateCommittedResource(&CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_DEFAULT), D3D12_HEAP_FLAG_NONE, &CD3DX12_RESOURCE_DESC::Tex2D(DXGI_FORMAT_D32_FLOAT, width, height, 1, 1, 1, 0, D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL), D3D12_RESOURCE_STATE_DEPTH_WRITE, &depthOptimizedClearValue, IID_PPV_ARGS(&depthStencilBuffer));
            depthStencilBuffer->SetName(L"Depth/Stencil Resource Heap");
            device->CreateDepthStencilView(depthStencilBuffer, &depthStencilDesc, dsDescriptorHeap->GetCPUDescriptorHandleForHeapStart());

有问题的教程:

3D Game Engine Programming

BraynzarSoft

最佳答案

一般来说,“中间资源”(例如深度模板和中间渲染目标)不会呈现在屏幕上。

因此,当一个交换链准备好呈现(并且您开始记录下一帧命令)时,可以安全地覆盖这些资源,因为内容已在交换链中准备就绪。

这些资源的唯一异常(exception)通常是从 cpu 上传的缓冲区,对于它们来说,每帧需要一个缓冲区(因为您将在另一个命令列表仍在执行时开始复制数据)。

关于visual-c++ - 为什么只需要 1 个深度/模板缓冲区,即使交换链是三重缓冲的 DirectX 12,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71461930/

相关文章:

c++ - 错误 C2102 : '&' requires l-value, VS2019。怎么修?

c++ - 如何使用 Triclops 和 FlyCapture SDK 从 PointGrey BumbleBee2 立体相机创建深度图?

qt - 使用 QOpenGLFramebufferObject 的 OpenGL 深度缓冲区不起作用

c++ - 离屏渲染(使用 FBO 和 RenderBuffer)以及颜色、深度、模板的像素传输

C++ 操作数到标准运算符的隐式转换

c++ - DirectX9、DirectDraw、优化?

C++鼠标左键按下帮助

c++ - DirectX 11 制作一个正方形。

多个输入的 C++ 大写函数失败

c++ - 在 C++ 中克隆一个 wchar_t*