关键问题是您不想让 GPU 停止以获得最佳性能。双缓冲是最低要求,但通常三缓冲更适合平滑帧到帧的渲染峰值等。
FWIW,DXGI 的默认行为Present
是仅在您提交三帧工作后才停止,而不是两帧。
当然,在三重缓冲和输入响应之间需要权衡取舍,但如果您保持 60 Hz 或更好的频率,则可能不会引起注意。
综上所述,通常您不需要双缓冲深度/模板缓冲区进行渲染,尽管如果您想让深度缓冲区的初始写入与先前深度缓冲区通道的读取重叠,那么您会为了性能和正确性,每帧需要不同的缓冲区。
由于在命令列表中注入了“资源屏障”,因此“写入”在 DX12 中的“读取”之前全部完成:
void FrameResource::SwapBarriers()
{
// Transition the shadow map from writeable to readable.
m_commandLists[CommandListMid]->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m_shadowTexture.Get(), D3D12_RESOURCE_STATE_DEPTH_WRITE, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE));
}
void FrameResource::Finish()
{
m_commandLists[CommandListPost]->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m_shadowTexture.Get(), D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE, D3D12_RESOURCE_STATE_DEPTH_WRITE));
}
请注意,此示例是旧版 DirectX SDK 示例MultithreadedRendering11的移植/重写,因此拥有两个阴影缓冲区而不仅仅是一个阴影缓冲区可能只是一种方便的工件。