【问题标题】:PNG Gamma CorrectionPNG 伽玛校正
【发布时间】:2018-12-04 11:29:01
【问题描述】:

我使用DirectXTex 库捕获了 DX11 游戏的屏幕截图并将其保存到文件中。问题是当我将它保存为 jpeg 时效果很好,但如果我将它保存为 png 图像会变得超级亮并且褪色。我使用TweakPNG 检查了图像,发现 gamma 设置为 1.0,这就是导致问题的原因。 我检查了其他一些软件(包括截图工具)拍摄的图像,它们似乎使用 0.45455 作为 gamma,或者完全忽略了 gamma 值。

我不知道DirectXTex 是否会让我指定伽玛值。我什至不确定WIC 是否具有此功能,因为我似乎无法在 MSDN 或其他网站上找到有用的信息。

【问题讨论】:

    标签: c++ directx-11 wic directxtk


    【解决方案1】:

    如果格式为DXGI_FORMAT_*_SRGB,默认情况下DirectXTex 会将sRGB 块添加到它写入的PNG 文件中。此外,如果格式为 not DXGI_FORMAT_*_SRGB,我会明确删除 sRGB 块并将 gAMA 块设置为 1.0,否则 WIC 总是会添加 sRGB块。

    您可以在DirectXTexWIC.cppDirectX Tool KitScreenGrab.cpp 模块的代码中看到这种行为。

    如果您没有进行“伽玛校正”渲染,其中您的渲染目标是 DXGI_FORMAT_*_SRGB 格式,但 sRGB 内容采用 DXGI_FORMAT_* 格式,那么我的建议是您将格式的 sRGB 版本传递给功能。

    在 DirectXTex 中,这很容易通过 MakeSRGB 函数完成。

    PNG 格式的 Gamma 校正有点乱。见this blog post

    【讨论】:

    • 感谢您的回答。我用相应的*_SRGB 格式创建了一个暂存后台缓冲区,它工作正常。但是,我想知道您选择 1.0 作为 gamma 是否有原因?我注释掉了你设置 gamma 的整个 else 块,它也工作得很好。我认为WIC 无论如何都将其视为 sRGB 并使用了默认伽玛,这似乎至少在Windows 10 中“更合适”。
    • 表面可能是 sRGB(大约与 2.2 次方相同)或“线性”(无伽马值,与 1.0 次方相同)。在现代游戏中的许多纹理的情况下,它们通常是对线性数据进行编码。如果您提供明确的_SRGB 格式,那么很明显将其写为sRGB 是正确的。如果您不提供_SRGB 格式,那么将其写为sRGB 很可能是错误的。
    • 我明白了。不过还有另一个问题。 Resize 现在在使用 SRGB 格式时需要很长时间。我的意思是慢几个数量级。我检查了源代码,发现我可以指定TEX_FILTER_FORCE_WIC,一切都会再次变得很快。我不确定这是否正确使用此选项。
    • 您使用的是调试模式还是发布模式? DirectXTex 库避免将 WIC 用于各种格式组合,因为它在许多情况下会做“错误的事情”,因此它在内部使用软件实现。您可以使用该标志来强制使用 WIC 并覆盖该逻辑。
    • 我都测试过。在调试模式下,它花费了 40 倍的时间。在发布模式下效果要好得多,但仍然需要 8 倍的时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-12
    • 1970-01-01
    • 1970-01-01
    • 2013-05-07
    • 2022-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多