我想在我的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位,我仍然可以得到有效的结果,包括分辨率列表。 后来我可以创build一个全屏交换链,有10位,并且所有的工作都可以。
但是,因为我不知道如果显示器是10位或8位,那么我不知道是否需要手动应用一些抖动来模拟10位。
所以我想知道,如果显示器实际上是10位=不需要抖动,或者是8位=那么我将应用我自定义的抖动着色器。
我正在使用经典的Win32 / WinAPI和新的通用Windows平台(所以我需要两种平台的解决scheme)。
您可能最好有一些用户设置来打开/关闭抖动,只需使用DXGI_FORMAT_R10G10B10A2_UNORM
作为您的交换链。
请注意, DXGI_FORMAT_R10G10B10A2_UNORM
也是一种有效的HDR格式,但需要手动应用ST.2084色彩曲线并适当设置色彩空间以指示使用宽色域(即HDR10)。 您可以使用DXGI_FORMAT_R16G16B16A16_FLOAT
并以线性色彩空间进行渲染,但是将其留给系统来做“正确的”事情,这可能会或可能不符合您的期望。
对于非HDR / 4kUHD场景,无论如何,由于DWM将您转换为8位,您无法以任何方式获得超过8位的窗口模式或UWP CoreWindows交换链。 对于Win32“经典”桌面应用程序的10位扫描可能是独占全屏模式,但有很多变量(DVI电缆不支持它)。
请参阅高动态范围和宽色域 ,以及D3D12HDR样本Win32 / UWP
确定显示器是否真的支持10位模式似乎非常棘手,因为许多10位模型实际上是8位+抖动(而许多8位模型只是6位+抖动)。 至少在我熟悉的一些软件中,这种检查是通过显示模型的白名单实现的。 所以我认为最好总是使用DXGI_FORMAT_R16G16B16A16_FLOAT
(这个可能是大多数适配器支持的)或者DXGI_FORMAT_R32G32B32A32_FLOAT
作为输出格式,让系统根据显示期望进行转换。 自定义抖动可以保留为用户的选项。