5

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

首先,我使用 NVIDIA Photoshop DDS 插件将纹理文件导出为 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 有不同的颜色空间,请告诉我在哪里可以找到它的规范。

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

4

1 回答 1

4

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

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

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

于 2012-11-21T11:44:53.270 回答