首页 > 编程知识 正文

自适应伽马校正,srgb超过100有用吗

时间:2023-05-04 08:55:53 阅读:12154 作者:4364

文章目录CRT显示器与人眼视觉非线性显示和渲染伽马校正sRGB纹理的精确光斑光衰减补充参考资料

CRT显示屏与人眼视觉

传统上,许多监视器是阴极射线管监视器(CRT )。 这些监视器具有输入电压的2倍产生2倍亮度的物理特性。 输入电压产生输入电压约2.2次方的亮度。 这本质上是个问题,但由于不可思议的偶然,CRT监视器的这一特性仍然存在。

这惊人的巧合是:人类的视觉系统进化了一个特性。 黑暗环境下的认识能力抗明亮环境,这可能有助于我们很快发现黑暗中隐藏的危险。 如下图所示,第1行表示人眼所感觉到的亮度,第2行表示实际的物理亮度。物理亮度基于光子数量, 是线性的, 而感知亮度基于人的感觉是非线性的.

从观察可以看出,物理亮度在我们的眼睛里缺少暗部的细节,亮部的细节显得过剩。 人眼对物理亮度的感知和CRT显示器显示亮度的电压的感知非常接近,CRT亮度是电压的2.2次方,人眼的观察亮度相当于物理亮度的平方,所以CRT这个缺陷正好能够满足人类的需要,后来的硬件也是该非

2.2这个数字叫伽玛,也叫伽玛系数。 各种显示设备都有各自的伽马值,用于校正的伽马值取决于显示器,但现代系统基本上统一使用2.2。

由于非线性和渲染显示器的非线性特性,亮度在我们的眼睛中看起来更好,但在渲染时反而可能会引起问题。我们的渲染计算都是在伽马值为 1 的理想线性空间进行的.例如,现在希望输入暗红色灯光(0.5、0.0、0.0 ),亮度加倍)为1.0、0.0。 0.0 ) .但是,由于显示器的非线性特性,最终显示的颜色实际上为(0.218,0.0,0.0 )至(1.0,0.0 ) ) )。

我们忽视了这个问题一次。 美术同学通常将光线设置得比原来更亮,以抵消显示器亮度的降低。 但这本来就是数学错误,如果使用更高级的光算法,这个问题就会越来越明显。 Physically Based Rendering兴起后,我们在渲染的基础上并不存在这样的问题,而是通过伽马校正技术(

伽马校正分析了上述错误情况,问题的原因是我们理想的输出颜色在显示器上执行了pow2.2的操作。 因此,伽马校正的想法是在颜色被传送到显示器之前,我们先对其进行 pow0.454 的逆运算以抵消显示器的作用.

伽马校正可以通过图形API提供的方法由硬件执行,也可以在像素着色器最终输出之前由我们自己执行。 但是,这两种方法都需要区分我们现在需要的颜色是在伽马1.0的线性空间还是在伽马2.2的sRGB空间。 例如,一个效果需要执行两个路径。 第一个路径将中间结果作为第二个路径的输入生成,数据还在线性空间的情况下不能进行伽马校正。因为将第二个路径生成的结果输出到显示器需要进入sRGB空间,所以在输出之前对计算结果进行伽马校正。

sRGB纹理2.2是大多数显示设备的平均伽马值。 虽然每个显示器的伽马曲线不同,但伽马2.2在大多数显示器上工作正常。 因此,大多数游戏都将伽马值设置为2.2,每个监视器.基于 Gamma 2.2 的颜色空间叫做 sRGB 颜色空间.

由于显示器始终在sRGB空间中显示应用gamma后的颜色,因此创建纹理资源的美术学生创建的所有纹理都在sRGB空间中。 在应用伽玛校正之前,该纹理在创建和使用的颜色空间中保持不变,因此可以正常使用。 但是,应用gamma校正后,由于将所有内容放置在线性空间中进行展示,纹理最终会意外变亮。 http://www.Sina .

让美术家在线空间制作纹理可以解决这个问题,但是伽马校正的内部逻辑并不一定是所有美术家都应该理解的知识,在sRGB空间制作明显更容易。这是由于在纹理制作时美术同学为了达到人眼的感知亮度相当于已经为实际需要的线性空间亮度进行了一次 pow0.454 的伽马校正, 如果此时不做处理直接使用就进行了两次伽马校正!复学可以在shader上进行。 读取纹理颜色后,进行pow 2.2的校正。 OpenGL还可以通过图形API在硬件中处理纹理,例如在创建纹理时指定为GL_SRGB或GL_SRGB_ALPHA。

给物体上色的纹理,例如33558www.Sina.com/diffuse贴图,几乎都位于sRGB空间中,相反,提供照明参数的纹理,例如法线贴图,几乎都存在

线性空间的. 将法线贴图配置为 sRGB 纹理反而会导致渲染错误.

正确的点光衰减

在真实世界中, 光源产生的亮度与距离的平方成反比, 也就是

float attenuation = 1.0 / (distance * distance);

但是当我们在光照计算中应用这一方程的时候会发现这个衰减过于强烈. 这时如果不进行伽马校正的话, 由于显示器的伽马值, 最终的衰减实际变成了 (1.0 / distance ^ 2) ^ 2.2, 这个衰减确实太过强烈了. 在引入伽马校正之前, 通常使用亮度与距离成反比的衰减公式. 不过在显示器伽马值的作用下, 这种衰减反而变得和物理公式很接近: (1.0 / distance) ^ 2.2 = 1.0 / distance ^ 2.2

无伽马校正有伽马校正平方衰减衰减过度期望图像线性衰减衰减接近期望效果但是画面整体亮度错误偏暗衰减不足

补充

在查阅相关资料的时候发现了一个精妙的方法, 此方法对人眼视觉, 显示器伽马等现象进行了直观的展现.

我们已知纯黑和纯白在显示时分别是 0 和 255. 如下图所示, 图像分为 3 列, 左右两列为黑线和白线的均匀混合, 中间一列为纯色色块. 这时让我们稍微远离屏幕, 可以发现两侧表现出来的颜色与中间列下半部分显示的颜色比较接近.


在我们朴素的线性空间认知下, 黑白均匀混合后得到颜色值应该在 128 左右. 也就是中间列上半部分的颜色值估计在 60 左右, 下半部分的颜色值应该在 128 左右. 但是事实上用取色器取色可以得知上半部分的颜色值才是 128, 下半部分的颜色值已经达到了 187. 这一现象正和我们上面研究的人眼视觉特性和显示器非线性特性有关.

左右两侧黑白混合线条的意义在于: 在屏幕上直接模拟出了一个亮度居中(0.5)的光源. 所以这张图表现出的含义如下.

参考资料 LearnOpenGL CN: Gamma校正知乎答案: 色彩校正中的 gamma 值是什么?Avatar YeGamma校正与线性空间 TraceYang

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。