我正在学习OpenGL中的sRGB颜色空间。
一件事是纹理的颜色,而另一件事是直接的颜色值,比如说来自图形编辑器的颜色。
0.5的颜色分量表示屏幕上的输出将是更浅的颜色187。
这里的最佳做法是什么-使用前我必须通过计算根数来对颜色进行解码吗?
答案 0 :(得分:1)
当使用GL_SRGB8
或GL_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中,否则将得到不正确的内插。