在 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 有不同的颜色空间,请告诉我在哪里可以找到它的规范。
任何帮助将不胜感激。谢谢!