【问题标题】:What are the exact color spaces of DXGI_FORMATs?DXGI_FORMAT 的确切色彩空间是什么?
【发布时间】:2012-11-09 13:52:56
【问题描述】:

在 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 有不同的色彩空间,请告诉我在哪里可以找到它的规范。

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

【问题讨论】:

    标签: graphics game-engine direct3d color-space dxgi


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的回答!它真的帮助了我。但是我还有一个问题:你说整数 RGB 值通常是经过伽马压缩的,而带有 _SRGB 的 DXGI 格式的伽马固定为 0.5。那么这两者有什么不同呢?他们的伽玛值相等吗?或者也许 _SRGB 只意味着它的值需要由硬件转换?谢谢!
    • 你好 SeaStar,sRGB 有一个更复杂的伽马形式,它不是一个单一的数字。我说过 DXGI 格式是整数但有一个 _SRGB 后缀有一个固定的 gamma,可能 0.5。具有 _SRGB 后缀的格式应该是 sRGB,因此具有复杂的 gamma。更多信息:“与大多数其他 RGB 颜色空间不同,sRGB 伽玛不能表示为单个数值。” en.wikipedia.org/wiki/SRGB希望有帮助!
    • 我在之前的评论中输入了一个错误的词,我想说“带有 _SRGB 的 DXGI 格式不是固定的 0.5 伽马。”今天我对它做了更多的研究。
    • 根据DXGI格式的数据转换规则(你可以在这里找到msdn.microsoft.com/en-us/library/dd607323%28v=vs.85%29.aspx),只有在SRGB格式和float格式之间进行转换时才会进行gamma校正或逆运算。 (也许也介于整数格式和 SRGB 格式之间)它使用您上面提到的精确 sRGB 转换公式。所以 DirectXTex 库(或者我们应该责怪 WIC 吗?)确实表现得很奇怪,或者至少不遵循标准。
    • 我还通过比较输出值和原始值计算了 DirectXTex 库用于从 ARGB32F 转换为 ARGB16UNORM 的正确伽马值,它大约是 2.2764,而不是通常的 2.0 或 2.2。好吧,现在对我来说,我只想将它转换回具有正确伽马值的线性空间并继续我的工作。再次感谢你。我很抱歉我的英语不好。
    猜你喜欢
    • 2010-09-26
    • 1970-01-01
    • 2017-09-20
    • 2018-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-25
    相关资源
    最近更新 更多