我想帮助您理解以下代码行:
return float3(pow(color.r, 2.2), pow(color.g, 2.2), pow(color.b, 2.2));
我见过一些地方称它为伽马校正,但我不知道它是否正确。
如果它真的是伽马校正,它是如何工作的?
经修正
我喜欢它的艺术效果,我会保留它。我问这个问题是为了更好地理解。
发布于 2021-04-13 13:20:19
在监视器上输出的像素的实际颜色与该像素的外加电压信号不成线性关系。对于CRT显示器来说,实际的颜色与施加的电压大致成正比,其功率为所谓的伽马值,这取决于监视器。对于CRT监视器来说,这个伽马值通常在2.2到2.5之间。(因此,在呈现应用程序时,神奇常数2.2的外观无处不在。)
要在计算中绕过这个伽玛值,您需要在呈现之前对每个像素的计算颜色进行伽马校正。通过将计算出的颜色提高到同一伽玛值倒数的幂,计算出的颜色与实际颜色成正比。
因此,一般来说,伽马校正是一种将计算出来的颜色与用于输出的监视器的传递函数相适应的技术。CRT和非CRT显示器都有各自的传输功能.这意味着最终的渲染传递应该根据使用的监视器调整计算出的颜色,以获得正确的实际颜色。
从监视器构造的角度来看,这些线性到伽玛色空间转换似乎是不必要的开销。在物理上完全有可能构造一个γ值正好为1的CRT监视器,确保计算出的颜色已经与实际颜色成比例,并消除了伽马校正的需要。
从知觉的角度来看,消除伽马校正的需要,并使用一个监视器,当计算出的颜色与相应的实际颜色成比例时,实际上是个坏主意。通常,对于每个红色、绿色和蓝色通道,实际颜色用8(或10)位表示。这种量化只支持256 (或1024)不同的颜色。在这里,0值代表完全黑色,255 (或1023)值代表完全白色。但是中间值呢?如果使用线性编码(即伽马值为1),则大多数值在感知上非常接近白色,极少数将明显接近黑色。通过使用伽马编码(例如,伽马值2.2),该分布在感知上更加线性(即黑白之间的等距间隔)。
发布于 2021-03-22 14:41:07
伽马校正起源于一种校正CRT输出的方法,使之更适合人类的视觉系统。现代监视器不需要这样做,但是,他们遵循CRT,有数百万的CRT都有伽马校正,大多数信号已经有伽马校正。今天,我们有一个鸡和鸡蛋problem...but反向。数以百万计的硬件鸡都会说伽马.
另一方面,我们人类在指数值的土地上的想法并不好,但从线性值的角度来看,我们确实考虑得很好。因此,图形代码软件倾向于删除伽马,然后我们可以以一种直观的方式进行乘法、添加和操作,并将其转换回伽马以供显示。
现代硬件有一些特殊的组件,可以随时完成这一任务,所以人们普遍接受的做法是设置图形硬件来处理这个问题,这样我们就不必像程序员那样担心它了。但有时它是有用的。
基于评论的更新(在重新阅读之后,我又添加了一些更新)
伽马校正对于低精度格式(如常见的sRGB 8位格式)有第二个好处。(20世纪90年代的S发明与当时的硬件相匹配)它重新分配了现有的价值,在“昏暗”的区域里,人们可以更好地感知亮度的变化。这种再分布就是为什么伽马校正常被称为伽马压缩。
这不是对人类视觉的修正,而是对8位格式局限性的修正。高精度格式不需要存储伽马校正,而且(通常)只有在转换为较低精度格式时才会应用伽马校正。
以下是与伽马有关的常见格式的细目:
非常令人惊叹的人眼可以通过动态调整自身以适应可用的照明,感知到1,000,000 nits的亮度差异。但特别适合在黑暗环境中看到更多的亮度变化。当CRT发明时,它很难显示出100 nits的亮度。在桌子上留下999,900尼特。因此,伽玛被应用于信号,以利用我们的能力,以更好地看到在低照明。这是CRT的局限,不是我们的愿景。
这是常见的现代显示器达到300-500纳特,有些型号高达1000纳特或更多。额外的可用亮度意味着,除了历史兼容性之外,伽马实际上并不是必需的。(这有点夸张,在伽马开始冗余之前,监视器确实需要进入10,000 nit的范围)
在处理图像数据时,最好配置硬件,为我们处理伽马校正,并使用诸如声调映射等方法来实现专门的外观。这允许硬件将存储为各种颜色格式(如sRGB和HDR )的图像加载到定义良好的公共空间中,然后代码可以执行其计算,并将结果发送到硬件,在硬件中将其转换为特定于用于显示它的设备的格式。(这通常是伽马校正格式)
我并不是说这个图像是“错误的”,每个人都应该花时间来创建这样的图像来更好地理解伽马校正。
发布于 2021-04-26 09:50:36
另外,请注意,POW2.2用于解码某些sRGB编码的纹理。在着色器结束时,对sRGB的最终编码将是pow 1.
另外,请注意,伽马校正是sRGB校正的近似。但在实践中,即使做正方形和方形也是相当不错的(而且比pow便宜) ;-)
https://computergraphics.stackexchange.com/questions/10763
复制相似问题