如何在sRGB空间中输入颜色值?

时间:2019-06-14 16:30:59

标签: opengl colors gamma srgb

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

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

0.5的颜色分量表示屏幕上的输出将是更浅的颜色187。

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

1 个答案:

答案 0 :(得分: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中,否则将得到不正确的内插。