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