Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检测显示器上的10位颜色支持 我想在DirectX C++窗口应用程序中添加10位颜色的支持。 我说的是使用DXGI_格式_R10G10B10A2_UNORM的每个RGB通道10位(RGB总共30位)_C++_Windows_Colors_Directx_Monitor - Fatal编程技术网

检测显示器上的10位颜色支持 我想在DirectX C++窗口应用程序中添加10位颜色的支持。 我说的是使用DXGI_格式_R10G10B10A2_UNORM的每个RGB通道10位(RGB总共30位)

检测显示器上的10位颜色支持 我想在DirectX C++窗口应用程序中添加10位颜色的支持。 我说的是使用DXGI_格式_R10G10B10A2_UNORM的每个RGB通道10位(RGB总共30位),c++,windows,colors,directx,monitor,C++,Windows,Colors,Directx,Monitor,如何检测系统是否支持该模式,我的意思是显示器是否支持该模式 因为例如,我正在枚举显示模式列表: 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(

如何检测系统是否支持该模式,我的意思是显示器是否支持该模式

因为例如,我正在枚举显示模式列表:

  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平台(因此我需要这两种平台的解决方案)。

确定监视器是否真正支持10位模式似乎非常棘手,因为许多10位模型实际上都是8位+抖动(而许多8位模型只是6位+抖动)。至少在我熟悉的一些软件中,这种检查是通过显示模型的白名单实现的。因此,我认为最好始终使用
DXGI_格式\u R16G16B16A16_浮点
(这可能是大多数适配器都支持的)或
DXGI_格式\u R32G32A32_浮点
作为输出格式,并让系统根据显示预期对其进行转换。自定义抖动可以作为用户的选项。

您最好使用某种用户设置来打开/关闭抖动,只需为您的交换链使用
DXGI\u格式\u R10G10B10A2\u UNORM

请注意,
DXGI_格式_R10G10B10A2_UNORM
也是一种有效的HDR格式,但需要手动应用ST.2084颜色曲线,并适当设置颜色空间,以指示使用宽色域(即HDR10)。您可以使用
DXGI_FORMAT_R16G16B16A16_FLOAT
并在线性颜色空间中进行渲染,但这取决于系统是否执行与您的期望相符的“正确”操作

对于非HDR/4kUHD场景,使用窗口模式或UWP CoreWindows swapchains无论如何都无法获得超过8位的内容,因为DWM正在将您转换为8位。Win32“经典”桌面应用程序的10位扫描输出可以采用独占全屏模式,但存在很多变量(例如DVI电缆不支持)


请参阅,以及D3D12HDR样本/

你好,查克,非常感谢您的回复。这就是我目前正在做的。到目前为止,这是具有用户设置的最佳解决方案。然而,它也有一些缺点-这对用户来说是一个不便,必须设置一些东西,而不是让这个自动检测,另一个问题是,用户可能根本不知道他的显示器支持什么,如果他选择错误,那么他实际上可能会变得更差的质量。例如,他可能会选择10位精度,认为他将获得比8位更好的质量。但实际上,在10位设置下,抖动着色器将被禁用,如果他的监视器是8位的,那么没有抖动着色器时,效果会更差。所以在用户设置中,我必须非常清楚这个选项的作用。最好的方法是,如果DirectX提供了一个选项来检测实际支持的内容和不支持的内容。我想请求在将来添加新功能。顺便说一句,这是我的游戏引擎,现在已经开发了好几年了,谢谢