DXGI_FORMAT 的确切颜色空间是什么?

Sea*_*tar 5 graphics direct3d game-engine color-space dxgi

在DXGI_FORMAT的官方文档中,告诉我们只有带有_SRGB枚举后缀的格式才属于sRGB色彩空间。我认为没有这个后缀的其他格式都在线性空间中。但是我在 DirectXTex 库中发现了格式转换函数的一个很奇怪的行为。(您可以从http://directxtex.codeplex.com/下载)

首先,我使用NVIDIA Photoshop DDS Plugin将纹理文件导出为DXGI_FORMAT_R32G32B32A32_FLOAT。然后我通过 LoadFromDDSFile() 函数加载这个文件,并通过 Convert() 函数将其格式转换为 DXGI_FORMAT_R16G16B16A16_UNORM。(这两个函数都是由 DirectXTex 库提供的。)

你猜怎么着?图像转换为DXGI_FORMAT_R16G16B16A16_UNORM后,所有像素的亮度也发生了变化,整个图像变得比以前更亮了。

如果在图像转换为 DXGI_FORMAT_R16G16B16A16_UNORM 格式后手动将像素值从 sRGB 空间转换为线性空间,则生成的像素值与输入相同。因此,我假设 DirectXTex 库将 DXGI_FORMAT_R32G32B32A32_FLOAT 视为线性色彩空间中的格式,并将 DXGI_FORMAT_R16G16B16A16_UNORM 视为 sRGB 色彩空间中的格式,然后将色彩空间从线性空间转换为 sRGB 空间。(我试图找出为什么Convert()函数也会转换颜色空间,但它是由WIC实现的,并且没有它的源代码。)

那么,DirectXTex 库中是否有任何错误?或者它是 DXGI_FORMAT 的真正标准?如果某些特殊的 DXGI_FORMAT 有不同的颜色空间,请告诉我在哪里可以找到它的规范。

任何帮助将不胜感激。谢谢!

Ale*_*x I 4

按照惯例,浮点 RGB 值是线性的,而整数 RGB 值是伽玛压缩的。伽玛压缩浮点没有特别的好处,因为伽玛的原因是在感知需要的地方使用更多位,并且浮点始终具有足够(可能过多)的位数,并且已经进行了伪对数编码(使用指数) 。(来源

请注意,DXGI 中并非特定 *_SRGB 的整数 RGB 纹理的颜色空间不是 sRGB,它依赖于驱动程序,并且通常具有固定的 gamma 0.5。

DirectXTex 库似乎运行正常。但是,请注意,您还依赖于用于捕获和显示 DDS 文件的任何软件的行为。对于 DirectXTex 来说,更好的测试就是在库中进行 float->int->float 的往返转换,并以数字方式(而不是视觉方式)比较结果。