gpt4 book ai didi

opengl - 什么是正确的 Gamma 校正函数?

转载 作者:行者123 更新时间:2023-12-05 02:08:11 25 4
gpt4 key购买 nike

目前,我使用以下公式在光照通过后对颜色进行 Gamma 校正(将它们从 RGB 颜色空间转换为 sRGB 颜色空间):

output = pow(color, vec3(1.0/2.2));

这个公式是 Gamma 校正的正确公式吗?我问是因为我遇到过一些人说不是,而且正确的公式更复杂并且与幂 2.4 而不是 2.2 有关。我还听说 R、G 和 B 三种颜色应该有不同的权重(比如 0.2126、0.7152、0.0722)。

我也很好奇当启用 GL_FRAMEBUFFER_SRGB 时 OpenGL 使用哪个函数。

编辑:这是 Guy Davidson 的演讲“关于颜色的一切知识都是错误的”中涵盖的众多主题之一。涵盖了 Gamma 校正功能here , 但整个演讲都与颜色空间有关,包括 sRGB 和 Gamma 校正。

最佳答案

Gamma 校正可能有任何值,但考虑到线性 RGB/非线性 sRGB 转换,2.2 是一个近似值,因此您的公式可能被认为既错误又正确: https://en.wikipedia.org/wiki/SRGB#Theory_of_the_transformation

真正的 sRGB 传递函数基于 2.4 Gamma 系数,并且在暗值处具有不连续性,如下所示:

float Convert_sRGB_FromLinear (float theLinearValue) {
return theLinearValue <= 0.0031308f
? theLinearValue * 12.92f
: powf (theLinearValue, 1.0f/2.4f) * 1.055f - 0.055f;
}
float Convert_sRGB_ToLinear (float thesRGBValue) {
return thesRGBValue <= 0.04045f
? thesRGBValue / 12.92f
: powf ((thesRGBValue + 0.055f) / 1.055f, 2.4f);
}

事实上,您可能会在某些使用 2.0 系数而不是 2.2 和 2.4 的 GLSL 代码中发现更粗略的近似值,以避免使用昂贵的 pow() (x*x sqrt() 代替)。这是为了实现最佳性能(在旧图形硬件的上下文中)和代码简单性,同时牺牲色彩再现。实际上,牺牲并不那么明显,而且大多数游戏都应用了额外的色调映射和用户管理的 Gamma 校正系数,因此结果与 sRGB 标准没有直接关系。

GL_FRAMEBUFFER_SRGB 和从 GL_SRGB8 纹理中采样应该使用更正确的公式(在纹理采样的情况下,它更可能是在 GPU 上预先计算的查找表而不是真实的公式,因为只有 256 个值要转换)。参见,例如,对 GL_ARB_framebuffer_sRGB extension 的评论:

 Given a linear RGB component, cl, convert it to an sRGB component, cs, in the range [0,1], with this pseudo-code:

if (isnan(cl)) {
/* Map IEEE-754 Not-a-number to zero. */
cs = 0.0;
} else if (cl > 1.0) {
cs = 1.0;
} else if (cl < 0.0) {
cs = 0.0;
} else if (cl < 0.0031308) {
cs = 12.92 * cl;
} else {
cs = 1.055 * pow(cl, 0.41666) - 0.055;
}

The NaN behavior in the pseudo-code is recommended but not specified in the actual specification language.
sRGB components are typically stored as unsigned 8-bit fixed-point values.
If cs is computed with the above pseudo-code, cs can be converted to a [0,255] integer with this formula:

csi = floor(255.0 * cs + 0.5)

这是另一篇描述 OpenGL 应用程序中 sRGB 用法的文章,您可能会发现它很有用:https://unlimited3d.wordpress.com/2020/01/08/srgb-color-space-in-opengl/

关于opengl - 什么是正确的 Gamma 校正函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61138110/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com