glTF - 设置颜色 - baseColorFactor

glTF - setting colors - baseColorFactor

我正在尝试操作 gltf 3D 模型,但是我不确定颜色是如何导出的。 baseColorFactor 中 0 到 1(或小于 1)之间的所有数字。

这肯定不是RGB也不是RGBA(我参考了这个页面:https://www.december.com/html/spec/colorrgbadec.html

 "materials" : [
    {
        "doubleSided" : true,
        "name" : "Material",
        "pbrMetallicRoughness" : {
            "baseColorFactor" : [
                0.8000000715255737,
                0.91026470959186554,
                0.909551368653774261,
                1
            ],
            "metallicFactor" : 0,
            "roughnessFactor" : 0.4000000059604645
        }
    },

任何指点将不胜感激。

它是RGBA格式,但数字介于0和1之间。如果要在格式中插入颜色:

  • RGB (255, 255, 255) [=white] 将所有值除以 255 并使用 1 (=最后一个值完全不透明
  • RGBA (255, 0, 0, 255) [=完全不透明的红色] 将所有分量除以 255

可以找到文档 here

实际上唯一的区别是,您可以插入更多颜色细微差别,因为每个通道有超过 255 个可能的值。

这确实是红色、绿色、蓝色和 Alpha,映射到 0.0 到 1.0 范围,但还有一个额外的转换:这些值已从 sRGB 颜色space 转换为线性使用sRGB transfer function. (The back story here is, the baseColorTexture is supposed to be stored in the sRGB colorspace and subject to hardware sRGB decoding, but the baseColorFactor 没有硬件解码器,因此直接指定为线性值。)

这个的简单版本,如果你有一个介于 0 和 255 之间的值,就是除以 255.0 并将其提高到 2.2 次方。这是一个近似值,但效果很好。因此,例如,如果您的红色值为 200,则您可以 运行 以下公式,此处显示为 JavaScript 但可以适用于任何语言:

Math.pow(200 / 255, 2.2)

这将给出大约 0.58597.

的线性红色值

请注意,alpha 值不受 sRGB 传递函数的影响,因此对于它们,您只需除以 255 并停在那里。

有些包会自动进行这种转换。例如,在 Blender 中,如果您单击 Base Color 颜色选择器,您会看到它有一个显示典型 CSS 样式颜色的“Hex”选项卡,以及一个具有数字线性的“RGB”选项卡值。

这可用于将典型的 CSS 颜色快速转换为线性 space。

VSCode glTF Tools (for which I'm a contributor) can also show glTF color factors 作为 CSS 值(反之亦然)。