IDXGIFactory2::CreateSwapChainForCoreWindow 方法 (dxgi1_2.h)
为交换链的输出窗口创建与 CoreWindow 对象关联的交换链。
语法
HRESULT CreateSwapChainForCoreWindow(
[in] IUnknown *pDevice,
[in] IUnknown *pWindow,
[in] const DXGI_SWAP_CHAIN_DESC1 *pDesc,
[in, optional] IDXGIOutput *pRestrictToOutput,
[out] IDXGISwapChain1 **ppSwapChain
);
参数
[in] pDevice
对于 Direct3D 11 和早期版本的 Direct3D,这是指向交换链的 Direct3D 设备的指针。 对于 Direct3D 12,这是指向直接命令队列的指针, (引用 ID3D12CommandQueue) 。 此参数不能为 NULL。
[in] pWindow
指向 CoreWindow 对象的指针,该对象与 CreateSwapChainForCoreWindow 创建的交换链相关联。
[in] pDesc
指向交换链说明 DXGI_SWAP_CHAIN_DESC1 结构的指针。 此参数不能为 NULL。
[in, optional] pRestrictToOutput
指向交换链限制的 IDXGIOutput 接口的指针。 如果交换链移动到其他输出,则内容为黑色。 可以选择将此参数设置为使用 DXGI_PRESENT_RESTRICT_TO_OUTPUT 限制此输出内容的输出目标。 如果未将此参数设置为限制输出目标上的内容,则可以将其设置为 NULL。
[out] ppSwapChain
指向变量的指针,该变量接收指向 CreateSwapChainForCoreWindow 创建的交换链的 IDXGISwapChain1 接口的指针。
返回值
CreateSwapChainForCoreWindow 返回:
- S_OK成功创建交换链。
- E_OUTOFMEMORY内存不可用以完成操作。
- DXGI_ERROR_INVALID_CALL 调用应用程序是否提供了无效数据,例如,如果 pDesc 或 ppSwapChain 为 NULL。
- 可能是 DXGI_ERROR 主题中介绍的其他错误代码,这些错误代码由传递给 pDevice 的设备类型定义。
适用于 Windows 7 的平台更新: 在安装了适用于 Windows 7 的平台更新的 Windows 7 或 Windows Server 2008 R2 上, CreateSwapChainForCoreWindow 因E_NOTIMPL失败。 有关适用于 Windows 7 的平台更新的详细信息,请参阅 适用于 Windows 7 的平台更新。
注解
随后可以调用 IDXGISwapChain1::GetDesc1 方法来检索分配的宽度或高度值。
由于一次只能将一个翻转表示模型交换链 (每层) 与 CoreWindow 相关联,因此如果尝试销毁翻转表示模型交换链并将其替换为另一个交换链,则延迟对象销毁的 Microsoft Direct3D 11 策略可能会导致问题。 有关这种情况的详细信息,请参阅 翻转演示文稿交换链的延迟销毁问题。
有关如何为交换链的后台缓冲区选择格式的信息,请参阅 转换颜色空间的数据。
重叠交换链
从Windows 8.1开始,可以在前台层中创建额外的交换链。 前台交换链可用于以本机分辨率呈现 UI 元素,同时纵向扩展后台交换链 ((例如游戏) )中的实时呈现。 这样一来,需要较低的分辨率呈现才能提高填充率,但不牺牲 UI 质量。通过在 pDesc 指向的DXGI_SWAP_CHAIN_DESC1中设置DXGI_SWAP_CHAIN_FLAG_FOREGROUND_LAYER交换链标志来创建前台交换链。 前台交换链还必须使用 DXGI_ALPHA_MODE_PREMULTIPLIED alpha 模式,并且必须使用 DXGI_SCALING_NONE。 预乘 alpha 表示在显示帧之前,每个像素的颜色值应已乘以 alpha 值。 例如,一个 Alpha 值为 50% 的 100% 白色 BGRA 像素设置为 (0.5, 0.5, 0.5, 0.5)。 alpha 预乘步骤可以在输出合并阶段完成,方法是应用应用混合状态 (请参阅 ID3D11BlendState) , 并将 D3D11_RENDER_TARGET_BLEND_DESC 结构的 SrcBlend 字段设置为 D3D11_SRC_ALPHA。 如果未完成 Alpha 预乘步骤,前台交换链上的颜色会比预期明亮。
如果硬件支持,前台交换链将使用多平面覆盖。 调用 IDXGIOutput2::SupportsOverlays 查询适配器以获取覆盖支持。
以下示例为 CoreWindow 创建前台交换链:
DXGI_SWAP_CHAIN_DESC1 swapChainDesc = { 0 };
swapChainDesc.Width = static_cast<UINT>(m_d3dRenderTargetSize.Width);
swapChainDesc.Height = static_cast<UINT>(m_d3dRenderTargetSize.Height);
swapChainDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
swapChainDesc.Stereo = false;
swapChainDesc.SampleDesc.Count = 1; // Don't use multi-sampling.
swapChainDesc.SampleDesc.Quality = 0;
swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
swapChainDesc.BufferCount = 2;
swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL;
swapChainDesc.Flags = DXGI_SWAP_CHAIN_FLAG_FOREGROUND_LAYER;
swapChainDesc.AlphaMode = DXGI_ALPHA_MODE_PREMULTIPLIED;
swapChainDesc.Scaling = DXGI_SCALING_NONE;
ComPtr<IDXGISwapChain1> swapChain;
HRESULT hr = dxgiFactory->CreateSwapChainForCoreWindow(
m_d3dDevice.Get(),
reinterpret_cast<IUnknown*>(m_window.Get()),
&swapChainDesc,
nullptr,
&swapChain
);
呈现完成后,将两个交换链一起呈现。
以下示例演示了这两个交换链:
HRESULT hr = m_swapChain->Present(1, 0);
if (SUCCEEDED(hr) && m_foregroundSwapChain)
{
m_foregroundSwapChain->Present(1, 0);
}
要求
要求 | 值 |
---|---|
最低受支持的客户端 | 适用于 Windows 7 的Windows 8和平台更新 [桌面应用 |UWP 应用] |
最低受支持的服务器 | 适用于 Windows Server 2008 R2 的Windows Server 2012和平台更新 [桌面应用 |UWP 应用] |
目标平台 | Windows |
标头 | dxgi1_2.h |
Library | Dxgi.lib |