【问题标题】:Linear gamma v.s. sRGB texture workflow in Godot?线性伽马与Godot中的sRGB纹理工作流程?
【发布时间】:2020-04-06 01:35:49
【问题描述】:

我的纹理资源应该是线性的还是 sRGB?无论哪种情况,导入它们的正确方法是什么?

(有a similar question on r/godot,但我没有看到任何彻底的答案。)

Godot 似乎假设所有 PNG 纹理都是线性的,而不管 PNG 中嵌入的任何 gamma 或 sRGB 信息。我通过对 PNG 进行十六进制编辑来测试这一点,使其具有各种类型的 gAMAsRGB 块。这与大多数图像编辑器不一致,它们往往默认使用非线性色彩空间。因此,如果您在例如创建 PNG Gimp 并将其粘贴在 Sprite3D 上,默认情况下它看起来会褪色。

Godot(至少在 3.2 中)有一个 Srgb 导入选项,当设置为 Enable 时,会使此类纹理看起来正常。但我担心:

  • 这个选项似乎是来自主干的removed
  • 如果 sRGB > 线性转换发生在 uint8 > float32 转换之前,这将丢弃很多颜色精度。
  • 如果Srgb 的默认Detect 设置没有检测到实际的sRGB PNG,它有什么意义?

还有hint_albedo,但我希望用户不必为了让纹理按预期工作而编写着色器。

推荐的纹理工作流程是什么?

【问题讨论】:

    标签: textures godot gamma srgb


    【解决方案1】:

    工作流程如下:

    • 在 2D 中,默认情况下不使用 HDR。如果未检测到纹理用于 3D,则纹理将作为非 sRGB 导入。
    • 在 3D 中,默认使用 HDR。如果检测到纹理以某种方式用于 3D,则纹理将自动导入为 sRGB。在 3D 中,它们也可以被检测为法线贴图,因此它们使用 RGTC 压缩(比通用纹理压缩算法更高效、更美观)。

    这个选项似乎是来自主干的removed

    这是有意的,因为 Vulkan 渲染器使用 bindless 纹理。 sRGB 转换现在在渲染纹理时直接完成,而不是在导入时完成。这允许在 2D 和 3D 上下文中使用相同的纹理,并使其在两者中看起来都正确。同样,在 Godot 4.0 中,您将能够使用相同的纹理,无论是否过滤,而无需复制它。

    【讨论】:

    • 感谢您的帮助!但我不明白。 “如果检测到纹理在 3D 中使用,纹理将自动导入为 sRGB”——我无法将其与我的测试相匹配。使用 Srgb=Detect,我的 Sprite3D 看起来很苍白,这意味着 PNG 值被解释为好像它们是线性的。我还尝试在 2D 和 3D 中使用相同的纹理; Srgb=Detect 在 2D 中看起来正常但在 3D 中显得苍白,而 Srgb=Enabled 在 2D 中看起来很暗但在 3D 中正常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-16
    • 1970-01-01
    • 2013-09-10
    • 2012-05-08
    • 2022-12-10
    • 2015-05-23
    相关资源
    最近更新 更多