在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_FORMATs的真正标准?如果某些特殊的DXGI_FORMAT有不同的颜色空间,请告诉我在哪里可以找到它的规格。
任何帮助都将不胜感激。谢谢!
答案 0 :(得分:1)
按照惯例,浮点RGB值是线性的,整数RGB值是伽马压缩的。伽玛压缩浮点数没有特别的好处,因为伽玛的原因是在感知需要时使用更多的位,并且浮点数在中具有足够(可能是过多的)位数并且已经是伪的日志编码(使用指数)。 (source)
请注意,DXGI中整数RGB纹理的颜色空间不是特定的* _SRGB,不是sRGB,它取决于驱动程序,并且通常具有0.5的固定gamma。
DirectXTex库看起来确实表现正常。但请注意,您还依赖于用于捕获和显示DDS文件的任何软件的行为。对DirectXTex进行更好的测试只是在库中进行往返转换float-> int-> float并以数字方式而不是直观地比较结果。