首页 > 解决方案 > D3D11 - 如何在没有 Windows 10 的情况下在显示器上启用 HDR

问题描述

我正在尝试在我正在使用的视频播放器上使用 HDR 渲染,但我似乎无法在我的显示器上激活 HDR(是的,我的显示器支持 HDR),在我看到的所有代码示例中,一切都指向将颜色格式设置为 R10G10B10A2_UNorm(我使用的是 SharpDX)并引用了本文中的所有文章https://www.asawicki.info/news_1703_programming_hdr_monitor_support_in_direct3d,但我仍然无法在我的显示器上启用 HDR。

例如,如果您知道 madVR 实际上可以做到这一点(它可以强制您的显示器在不通过 Windows 10 的情况下启用 HDR)。我认为这称为 HDR 直通。这是怎么做到的?

这是我正在运行的代码,它实际上可以绘制一个白屏。

this.d3dDevice = new D3D11.Device(DriverType.Hardware, DeviceCreationFlags.None, new[] { FeatureLevel.Level_11_1, FeatureLevel.Level_11_0, });

SharpDX.DXGI.SwapChainDescription1 swapChainDescription_ = new SharpDX.DXGI.SwapChainDescription1()
{
    AlphaMode = SharpDX.DXGI.AlphaMode.Ignore,
    Width = Proc2.Width,
    Height = Proc2.Height,
    Format = Format.R10G10B10A2_UNorm,
    Scaling = SharpDX.DXGI.Scaling.None,
    BufferCount = 3,
    SwapEffect = SharpDX.DXGI.SwapEffect.FlipDiscard,
    Flags = SharpDX.DXGI.SwapChainFlags.AllowModeSwitch,
    Usage = SharpDX.DXGI.Usage.BackBuffer | SharpDX.DXGI.Usage.RenderTargetOutput,
    SampleDescription = new SharpDX.DXGI.SampleDescription() { Count = 1, Quality = 0 },
    Stereo = false,
};

parentSwapchain = new SharpDX.DXGI.SwapChain1(factory2, d3dDevice, this.renderForm.Handle, ref swapChainDescription_, new SharpDX.DXGI.SwapChainFullScreenDescription()
{
    RefreshRate = new Rational(144, 1),
    Scaling = SharpDX.DXGI.DisplayModeScaling.Unspecified,
    Windowed = true,
    ScanlineOrdering = SharpDX.DXGI.DisplayModeScanlineOrder.Unspecified,
}
);

谁能指出我错过了哪一部分?我只想强制我的显示器使用我的 Direct3D 代码启用 HDR。

标签: directx-11

解决方案


深入研究...我发现 Kodi 的 HDR 版本实际上可以做到这一点:https ://forum.kodi.tv/showthread.php?tid=349861 。看起来有一个 Windows API(我认为是从 1903 年开始)使您能够通过DisplayConfigGetDeviceInfoDisplayConfigSetDeviceInfo. 这并不简单,因为您需要先查询显示器的功能并进行设置。我能够用 C++ 编写测试代码来做到这一点。我只需要做一些 pInvoke 让它在 C# 上运行。


推荐阅读