我想在我的DirectX C ++ Windows应用程序中添加对10位颜色的支持。 我正在使用DXGI_FORMAT_R10G10B10A2_UNORM谈论每个RGB通道10位(RGB总计30位)。
如何检测系统是否支持,我的意思是显示器是否实际支持这种模式?
因为例如,我列举了显示模式列表:
IDXGIOutput *output=null; for(Int i=0; OK(adapter->EnumOutputs(i, &output)); i++)
{
DXGI_FORMAT mode=DXGI_FORMAT_R10G10B10A2_UNORM;
UInt descs_elms=0; output->GetDisplayModeList(mode, 0, &descs_elms, null); // get number of mode descs
RELEASE(output);
}
即使我的笔记本电脑显示器不支持10位,我仍然会得到有效的结果,包括分辨率列表。 后来我可以创建一个全屏交换链,有10位,一切正常。
但是因为我不知道显示器是10位还是8位,所以我不知道是否需要手动应用一些抖动来模拟10位。
所以我想知道的是,如果显示器实际上是10位=不需要抖动,或者它是8位=那么我将应用我的自定义抖动着色器。
我正在使用经典的Win32 / WinAPI和新的通用Windows平台(所以我需要两个平台的解决方案)。
答案 0 :(得分:1)
您可能最好使用某种用户设置来打开/关闭抖动,只需使用DXGI_FORMAT_R10G10B10A2_UNORM
作为交换链。
请注意,DXGI_FORMAT_R10G10B10A2_UNORM
也是有效的HDR格式,但需要手动应用ST.2084颜色曲线并适当设置颜色空间以指示使用宽色域(即HDR10)。您可以使用DXGI_FORMAT_R16G16B16A16_FLOAT
并使用线性色彩空间进行渲染,但是您可以将其留在系统中以执行“正确”操作。可能符合您的期望的东西。
对于非HDR / 4kUHD场景,无论如何,您无法获得超过8位的窗口模式或UWP CoreWindows交换链,因为DWM会将您转换为8位。 10位扫描输出Win32' classic'桌面应用程序可以使用独有的全屏模式,但有很多变量(例如DVI电缆不支持它)。
请参阅High Dynamic Range and Wide Color Gamut以及D3D12HDR示例Win32 / UWP
答案 1 :(得分:0)
确定monitor 是否支持10位模式似乎非常棘手,因为许多10位模型实际上是8位+抖动(以及许多8位模型)只是6位+抖动)。至少在某些软件中,我熟悉这种检查是通过显示模型的白名单实现的。所以我认为最好总是使用Jhon
(这个可能是大多数适配器都支持)或DXGI_FORMAT_R16G16B16A16_FLOAT
作为输出格式,让系统根据显示预期来转换它。自定义抖动可以留给用户选择。