交换链控制后台缓冲区旋转,形成图形动画的基础。
概述
Direct3D 12 中交换链的编程模型与早期版本的 D3D 中的编程模型不同。 例如,支持 D3D10 和 D3D11 中存在的自动资源轮换的编程便利性不再受支持。 自动资源旋转使应用能够呈现相同的 API 对象,而呈现的实际图面会更改每个帧。 使用 Direct3D 12 更改交换链的行为,使 Direct3D 12 的其他功能具有较低的 CPU 开销。 不支持自动颜色键和多重采样,尽管仍存在拉伸和旋转。
缓冲区生存期
允许应用存储引用后退缓冲区的预创建描述符。 这通过确保交换链拥有的缓冲区集在交换链的生存期内永远不会更改来实现。 IDXGISwapChain::GetBuffer 返回的缓冲区集在调用某些 API 之前不会更改:
GetBuffer 返回的缓冲区顺序 永远不会更改。
IDXGISwapChain3::GetCurrentBackBufferIndex 将当前后退缓冲区的索引返回到应用。
交换效果
唯一支持的交换效果是 DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL 和 DXGI_SWAP_EFFECT_FLIP_DISCARD,这要求缓冲区计数大于一个。
在窗口模式和全屏模式之间切换
Direct3D 12 不支持全屏独占模式(FSE)。 相反,当游戏是屏幕上唯一可见的应用程序时,OS 会使用一种称为全屏优化器(FSO)的策略来实现与 FSE 类似的效果,而没有性能缺点。 有关 FSO 的详细信息,请参阅 揭秘全屏美化。
Direct3D 12 保持了应用程序在窗口模式和全屏模式之间切换后必须调用 ResizeBuffers 的限制(D3D11 翻转模型交换链具有相同的限制)。
IDXGISwapChain::SetFullscreenState 转换不会更改交换链中的应用可见缓冲区集。 仅 ResizeBuffers 和 ResizeTarget 调用创建或销毁应用可见缓冲区。 但是,在 Direct3D 12 IDXGISwapChain::SetFullscreenState 不会进入全屏独占模式,只需更改分辨率和刷新率以允许全屏优化。 应用无需使用此方法即可进行这些更改
调用 IDXGISwapChain::P resent或 IDXGISwapChain1::P resent时,要呈现的后台缓冲区必须处于 D3D12_RESOURCE_STATE_PRESENT 状态。 如果情况并非如此,则存在 DXGI_ERROR_INVALID_CALL 失败。
全屏交换链继续存在限制,即在交换链的最终发布之前,必须调用 SetFullscreenState(FALSE,NULL)。 SetFullscreenState(FALSE) 在 Direct3D 12 设备上运行的交换链上成功。
在创建交换链时提供的 3D 队列中出现当前作,应用可以同时呈现多个交换链,并记录和执行命令列表。
当图形工作的最后一部分(例如帧后处理)在计算队列上完成,或者不涉及设备的图形队列时,创建要呈现的第二个 3D 队列可能会有益,并防止呈现延迟下一帧的开始。
例
以下示例代码将出现在主呈现循环中:
void Present()
{
m_swapChain->Present(0, m_presentFlags);
m_backBufferIndex = (m_backBufferIndex + 1) % m_backBufferCount;
}
创建交换链
使用 CreateSwapChainForHwnd、CreateSwapChainForCoreWindow或 CreateSwapChainForComposition 调用时,请注意,pDevice 参数实际上需要指向 Direct3D 12 中的直接命令队列的指针,而不是设备。
在 Windows 7 上演示
在 Windows 7 上面向 Direct3D 12 时,Direct3D 12 所需的 DXGI 类型不存在,因此必须使用 D3D12On7 提供的 ID3D12CommandQueueDownLevel(从直接命令队列中查询)提供。
你向 Windows 7 演示方法提供一个打开的命令列表,该方法随后将使用、关闭并自动提交到设备。 必须提供必须应用创建的后台缓冲区,必须是提交的资源,必须进行单采样,并且必须是以下格式之一。
- DXGI_FORMAT_R16G16B16A16_FLOAT
- DXGI_FORMAT_R10G10B10A2_UNORM
- DXGI_FORMAT_R8G8B8A8_UNORM
- DXGI_FORMAT_R8G8B8A8_UNORM_SRGB
- DXGI_FORMAT_B8G8R8X8_UNORM
- DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM
- DXGI_FORMAT_B8G8R8A8_UNORM
- DXGI_FORMAT_B8G8R8A8_UNORM_SRGB