【问题标题】:How do I input color values in sRGB space?如何在 sRGB 空间中输入颜色值?
【发布时间】:2019-06-14 16:30:59
【问题描述】:

我正在学习 OpenGL 中的 sRGB 颜色空间。

一方面是来自纹理的颜色,另一方面是直接的颜色值,比如说来自图形编辑器。

颜色分量 0.5 意味着屏幕上的输出将是较浅的颜色,即 187。

这里的最佳做法是什么 - 我必须在使用前通过计算根来解码颜色吗?

【问题讨论】:

  • "让我们从图形编辑器中说。" 那么,图形编辑器在什么色彩空间中工作?
  • 关于“最佳实践”问题,很好的解释here
  • 正如我所说,编辑器中的 0.5(或 127)在带有 sRGB 的 OpenGL 窗口中变为 187。

标签: opengl colors gamma srgb


【解决方案1】:

当使用GL_SRGB8GL_SRGB8_ALPHA8 内部格式指定纹理时,OpenGL 会在您对纹理进行采样时为您处理sRGB 到线性转换。对于所有其他颜色值(制服、顶点属性、清晰颜色等),您需要手动进行转换。

从 sRGB 到线性的转换很简单。您可以在wikipedia 上查找该功能并将其翻译成您喜欢的任何语言。例如在 C 中:

float srgb_to_linear(float x) {
    return x <= 0.04045f ? x / 12.92f : powf((x + 0.055f)/1.055f, 2.4f);
}

这会将 [0,1] 范围内的 sRGB 的一个分量转换为 [0,1] 范围内的线性。要从大多数图形编辑器向您展示的 8 位 sRGB 转换,请将每个组件除以 255.,然后将上述函数应用于每个组件:

void srgb8_to_linear(uint8_t in[3], float out[3]) {
    for(int i = 0; i < 3; ++i)
        out[i] = srgb_to_linear(in[i]/255.f);
}

如果性能很重要,预先计算所有 256 个不同值的查找表可能会有所帮助。

请注意,尽早转换为线性很重要。例如。如果你将这些颜色作为插值顶点属性传递,那么你应该将线性值存储在 VBO 中,否则你会得到不正确的插值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-23
    • 2013-08-11
    • 2010-11-13
    • 1970-01-01
    • 1970-01-01
    • 2013-01-19
    • 1970-01-01
    相关资源
    最近更新 更多