gpt4 book ai didi

c++ - Gamma 校正看起来没有正确校正,这是线性的吗?

转载 作者:太空狗 更新时间:2023-10-29 20:24:07 33 4
gpt4 key购买 nike

我想对我的 OpenGL 照明实现 Gamma 校正,但应用 Gamma 校正后,我的结果看起来根本不是线性的。

我还找到了OpenGL: Gamma corrected image doesn't appear linear这与我的问题非常相似,但尚未收到答复,也未讨论实际的漫射光。

作为示例,我在线性空间中定义了以下 4 种光色:

glm::vec3 lightColors[] = {
glm::vec3(0.25),
glm::vec3(0.50),
glm::vec3(0.75),
glm::vec3(1.00)
};

将每个光源分开并将基本线性衰减应用于漫射照明方程式后,我得到以下结果:

wrong gamma

这是片段着色器:

void main()
{
vec3 lighting = vec3(0.0);
for(int i = 0; i < 4; ++i)
lighting += Diffuse(normalize(fs_in.Normal), fs_in.FragPos, lightPositions[i], lightColors[i]);
// lighting = pow(lighting, vec3(1.0/2.2));
FragColor = vec4(lighting, 1.0f);
}

我不仅几乎看不到经过 Gamma 校正的灯光有任何亮度差异,而且衰减也因 Gamma 校正而失真。就我的理解而言,所有计算(包括衰减)都是在线性空间中完成的,并且通过校正 Gamma ,监视器应该正确显示它(因为它再次将其作为输出取消校正)。仅根据灯光颜色,最右边的圆圈应该是左边圆圈的 4 倍和第二个圆圈的两倍,但事实似乎并非如此。

是我不够敏感,无法感知正确的亮度差异还是出了什么问题?

我尝试的其他方法是简单地将准确的光颜色输出到默认的帧缓冲区,不使用和使用 Gamma 校正。

gamma output

左边是未校正的,右边是经过 Gamma 校正的;红色数字表示来自 Photoshop 颜色选择器的 RGB 强度。我知道 Photoshop RGB 值不代表最终输出图像(因为 photoshop 不读取 RGB 值作为监视器输出)。左边的图像直观上看起来更好,但基于 RGB 强度值,我会说最右边的图像确实由我的片段着色器正确地进行了 Gamma 校正;因为这些强度中的每一个都会通过显示器并以正确的强度进入我的眼睛。例如,经过 0.88 Gamma 校正后的 0.75 强度在显示器输出时变为 0.88^2.2 = 0.75。

正确的图像确实正确吗?而且,与其他图像相比,实际光线怎么会这么暗?

最佳答案

您得到的结果是可以预期的。

您似乎将显示器产生的物理辐射亮度与人类的感知亮度混淆了。后者是非线性的,简单的 Gamma 模型是一种近似的方法。基本上,显示器反转人眼的非线性变换,因此标准(非线性)RGB 空间被线性感知 - 使用 RGB 强度 0.5 被感知为大约是 1.0 亮度的一半,因此上。

如果您在显示 Gamma 校正灰度级别时将色度计或分光光度计放在显示器上,您实际上会看到 0.73 步长将显示大约 50% 的白色亮度,单位为 candela/m^2 (假设您的显示器与顺便说一句的 sRGB 模型没有太大偏差。不使用 gamma 2.2,而是将线性段与 gamma 2.4 结合用于其余部分,2.2 只是另一个近似值)。

现在的问题是:你到底想达到什么目的?如果您想进行物理上精确的计算,通常需要在线性颜色空间中工作。但是,如果一个光源的亮度是另一个光源亮度的 50%,那么对人来说,亮度就不是另一个光源的一半,你得到的结果基本上是正确的。

如果您只想拥有一个在感知亮度方面呈线性的色彩空间,您可以完全跳过 Gamma 校正,因为 sRGB 已经在尝试提供这一功能。如果您想要准确的结果,您可能只需要进行一些颜色校准或小的 Gamma 调整来纠正显示器引入的偏差。

关于c++ - Gamma 校正看起来没有正确校正,这是线性的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29806039/

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