我最近从一个物理角度观看了这段视频,该视频谈到了我们在计算机上处​​理色彩的大多数方式是不正确的,因为亮度是对数而不是线性比例。作为一名新手图形程序员,我想知道如何处理这些信息以使我的图形更好。我可以找到光线追踪器,但是对于像HDR这样的光栅化,模糊,渐变和调光,我应该如何处理这些信息?

所以我想我有一些问题。 (非常抱歉)


大多数纹理数据以rgb亮度不正确的格式存储,因为它没有平方根(对吗?),因此如果我们要显示它
正确使用纹理时,高斯公式在技术上是否正确?如果是这样,那么数学上正确的方法是什么。
监视器负责解决此问题的哪一部分?它求值的平方还是平方根?
当您要求它对某一点进行颜色采样时,GPU负责解决问题的哪一部分?它是对值求平方还是平方根?
人们是否知道此属性,而只是不采取行动,因为对数字求根是一种昂贵的计算?如果是这样,我们是否有一个很好的方法可以快速近似0-1的数字平方根?
如何将视频中的知识应用到图形中?


#1 楼

视频中谈论的内容称为伽马校正,这是图形程序员非常熟悉的话题。 John Hable关于Uncharted 2渲染的演讲的前30分钟是我最喜欢的介绍,“为什么图形程序员应该关心伽玛”,也是对HDR渲染的很好介绍。如果您不想观看演讲(尽管我极力推荐),那么“线性的重要性”也是一篇不错的文章,Charles Poynton的Gamma FAQ涉及了更多技术细节并解释了所使用的术语。
顺便说一下,平方根/平方根只是一个近似值; sRGB伽玛曲线是实际中最常用的曲线(请参见其中提及$ C_ \ text {srgb} $和$ C_ \ text {linear} $的公式)。另请参阅有关伽玛和色彩空间的此相关问题。话题比视频听起来要复杂。 :)
要回答您的特定问题:是的,大多数图像数据都以伽马格式存储,因此像素值不代表线性亮度。我不会将其描述为“不正确的”,因为伽玛编码具有将更多的值置于黑暗中的有用特性,这对于感知精度更好(如视频中所述)。对于每个RGB分量只有8位的图像来说,绝对必要使用Gamma编码。如果存储了线性值,则每个组件需要更多的12位才能在黑暗中获得足够的精度。


要更物理上正确,在模糊图像时,应将其转换为线性亮度,然后进行模糊处理(高斯或其他方式),然后将其转换回原始色彩空间。


监视器接收伽玛格式的图像数据。因此,像素值不代表线性亮度,并且输出亮度与像素值不成线性比例。
如果它是高质量的经过校准的显示器,则它将接受特定颜色空间(例如sRGB或Adobe RGB)中的数据,并根据该颜色空间的定义准确地再现颜色。如果这是一台未经校准的废话显示器,那么谁知道您会得到什么,但这有点像sRGB。


GPU可以在此处配置为执行各种操作。现代GPU具有硬件支持,可以在对纹理进行采样或将值存储到帧缓冲区时自动在gamma和线性之间转换值,但是程序员必须使用Direct3D或OpenGL之类的API明确启用该功能。


计算机图形学人员当然确实了解此主题,因此在为电影,AAA游戏等构建逼真的渲染器时,使其正确至关重要。但是,更多的“日常”应用程序,例如Web浏览器和图像编辑器(甚至如视频所述,甚至是Photoshop)也无法真正正确地处理伽玛。
这不是处理能力的问题;它不是处理能力的问题。也许这是20年前的问题,但是今天,即使是手机,也具有足够的处理能力,可以在伽马和线性之间转换图像。网络浏览器和图像编辑器仍然无法正确解决这个问题的原因是:(a)无知,(b)不相信伽玛足够重要以至于值得纠正,以及(c)坚持不良行为因为这种方式已经存在了很长时间,并且用户已经开始期待它了,所以如果有什么变化,他们会很害怕。


如前所述,在构建渲染器时,我们必须考虑很多有关伽玛的问题。大多数计算(例如照明)应在线性空间中进行,但输入纹理和输出图像应在伽马空间中。另外,也许渲染的某些部分(例如UI合成)应该在伽玛空间中发生,因为它对艺术家更熟悉(它更像是Photoshop图层合成等)。另外,我们必须决定内部渲染目标是存储在线性空间还是伽马空间中,因为这会影响精度。而且我们必须正确处理所有转换,以便在渲染过程中的正确位置在线性和伽马之间转换数据。



评论


$ \ begingroup $
实际上,由于向后兼容并且对于旧用户而言几乎没有什么惊喜,因此您实际上可以将Photoshop特效变成默认情况下不会对其进行配置文件识别。请注意,尽管它并不完美。我要说的是,总体而言,我们的所有色彩校正工作流程都完全被改组了,因为如果在以后的日期中继续使用此功能。之所以针对5我建议(d),因为重建新的全面标准以替代旧标准非常困难且耗时。
$ \ endgroup $
– joojaa
16-4-4在7:12