对于着色器数学,为什么线性RGB保持sRGB的色域?


13

sRGB通常与“线性RGB”形成对比。

  • 图像存储在磁盘上,并以sRGB的形式传递到显示器其强度在视觉上大致均匀。
  • 着色器数学是在线性RGB上完成的,线性RGB在强度上是均匀的。
  • 可以应用伽玛校正在两者之间进行转换。

现在,sRGB有一个标准,该标准可比色地指定其色域,准确说明纯红色,绿色,蓝色和白色的位置。但是,对于“线性RGB”没有相应的标准。 色度图上的任何三角形都可以说是线性的,实际上,有几个众所周知的色域可供选择:

RGB色域

实际上,当我们说“线性RGB”时,是指“没有伽马校正的sRGB”。(这是我们在将sRGB伽玛校正作为最后的后处理步骤但忽略其余渲染管线的颜色空间时所做的工作。)

但是,为什么 RGB色域的正确使用进行插值,照明计算?似乎是任意的。如果有的话,我们不是要使用最大可能的色域进行内部计算,然后最后将颜色裁剪或缩放到输出设备的色域吗?

不管是什么,RGB照明都将是近似的,所以我们选择哪种色域都没有关系,我们还可以选择最接近显示器本身支持的色域?只是过失吗?还是以某种方式在这些不同色域中进行计算实际上得出了完全相同的结果?

Answers:


13

必须避免谈论线性RGB,因为它不会告诉您有关RGB色彩空间内在特性的任何信息,即基本色,白点和色彩分量传递函数。几年前,假设它是sRGB是中等水平,但如今,由于DCI-P3和BT.2020非常普遍,因此必须排除它。

渲染的理想色域是一种将与实际参考相关的误差最小化的色域,或更方便的是,地面真实频谱渲染。这句话的第一点是,各种RGB色彩空间不相等,不会产生相似的结果。

一个人可能会认为执行两个具有相同基色的渲染,但一个渲染使用sRGB / BT.709编码,另一渲染使用DCI-P3编码,然后将两个结果图像转换为例如ACES2065-1产生相同的图像,但事实并非如此。由于线性代数和矩阵的性质,一些数学运算取决于给定的RGB色空间原色,即基于色空间。一旦转换回CIE XYZ颜色空间,在不同RGB颜色空间中执行的相同操作将产生不同的三刺激值。例如,乘法,除法和幂运算依赖于RGB色彩空间原色,而加法和减法则无关。

RGB颜色空间和指数

此图像说明了将各种颜色本身乘以不同的RGB色彩空间的效果:所得的颜色是不同的。生成各种样本的方式如下:选取3个随机的sRGB色彩空间值并将其转换为三个研究的RGB色彩空间,将它们取幂,转换回sRGB色彩空间,在左侧的CIE 1931色度图中绘制,并在屏幕上显示为色板。对。

Ward和Eydelberg-Vileshin(2002)Langlands和Mansencal(2014)Mansencal(2014)进行的测试和研究表明,具有与光谱轨迹最接近的原色(即光谱清晰的原色)的色域倾向于将误差降至最小。真相呈现。

这是我最近与Mitsuba一起渲染的图像,以重新验证我们与Anders的发现:

渲染色彩空间

这些是使用BT.709原色(第一行),47个光谱仓(第二行),BT.2020原色(第三行),光谱减去BT.709原色渲染残差(第四行),光谱减去BT的同一场景的渲染。 .2020原色渲染残差(第五行)。最后一行展示了合成图像,这些合成图像分别带有三个垂直条纹,分别是BT.709原色,光谱图和BT.2020原色渲染图。直接照明往往会在渲染之间匹配。BT.709和BT.2020原色中多次反射光的效果(即天花板)表现出的饱和度趋于增加,尤其是在BT.709原色中,能量渲染或能量损失很小,尤其是在BT中.2020渲染。排除异常值(例如可见光源),具有光谱渲染的RMSE为0.0083BT.2020原色和BT.709原色渲染分别为0.01160.0116

现在,这并不意味着它们总是会表现得更好,并且可能会产生出一些对BT.709 / sRGB有偏见的示例。主要结论是RGB渲染无法与光谱渲染匹配,并且锐利的宽色域往往表现更好。至于选择渲染色彩空间,我会选择一个具有广泛色域的颜色,其中包括Pointer's Gamut,而DCI-P3,BT.2020ACEScg就是最佳的选择。


5

实际上,当我们说“线性RGB”时,是指“没有伽马校正的sRGB”。

可以说存在“ sRGB颜色空间”和“线性化的sRGB颜色空间”,而sRGB规范定义是从一个到另一个的转换。

是的,有无限多个“线性RGB”颜色空间。但是所有这些“线性RGB”色彩空间的共同点是它们是线性的。这意味着,如果将任何组件的值加倍,则将组件表示的光的强度加倍。从本质上讲,这就是“线性”的含义:颜色值与该浅色的最终强度之间存在线性映射。

这很重要,因为如果颜色值不线性映射到光照强度,则光照方程式将不起作用。但是这些方程式并不关心您使用哪种线性色彩空间。您只需要选择一个即可。

因此,线性化的sRGB色彩空间不会比线性化的Adobe RGB色彩空间或线性化SWOP CMYK色彩空间更正确。重要的是两件事:

  1. 颜色空间代表值到光强度的线性映射。
  2. 在照明方程式中始终使用所选的色彩空间。也就是说,照明方程式中使用的所有颜色都来自相同(线性)的色彩空间。

不管是什么,RGB照明都将是近似的,所以我们选择哪种色域都没有关系,我们还可以选择最接近显示器本身支持的色域?

事实是,如今sRGB转换已内置到硬件中,而其他色彩空间转换却经常没有。因此,如果要使用线性化的Adobe RGB色彩空间,则必须在着色器中进行大量工作,以使纹理像素值线性化并对其正确执行双线性/三线性插值(需要在线性化之后完成),然后才能应用他们对照明方程式。然后,您必须完成从线性化Adobe RGB到线性化sRGB的转换,以便可以写入sRGB帧缓冲图像进行显示。

或者,您可以只在各处使用线性化的sRGB并具有性能。后者往往胜出。


您如何看待这篇文章?如果我没看错的话,它表明在不同的线性颜色空间中进行的计算确实会导致不同的结果。
Maxpm

@Maxpm:这很有趣。我读过的论文是,问题归结为这样一个事实,即光线实际上不适合我们的RGB颜色空间模型。在数学上应该是同一件事,这导致了不同的视觉结果。在那里,唯一的解决方案似乎是停止使用RGB,然后开始使用光谱渲染。
Nicol Bolas

@Maxpm,但是在所有其他空格都不同之后,它们当然会这样做。但是,RGB不是颜色,所以它是彩色的。但是,接下来有一个问题是您想成为正确的人。收益变得越来越小,
joojaa

0

特别是为什么sRGB有两个方面。对于输入的非HDR图像,声称应该假定这些图像已压缩为sRGB(此说法是否准确是另一回事)。因此,在对它们执行任何线性数学运算之前,需要从sRGB解压缩它们。还可能会捕获图像并将其压缩为非sRGB的其他表示形式,在这种情况下,您需要解压缩该特定表示形式。在任何情况下,编码都意味着输入图像永远不会逃脱的某个色域(因为sRGB存储的图像通常会被截断为每个通道8位),但是您的着色器数学不必在输入后保持该色域图像被解压缩。但是最后您必须考虑显示。

如果您有图像并且是时候显示它,则以显示设备所需的表示形式对其进行编码。CRT选择了sRGB,然后LCD进行了模拟,因此在过去的几十年中,用于显示器显示的sRGB压缩一直是常见的选择,并且将输出限制在sRGB色域内,否则会发生削波。较宽的显示范围不必遵循确切的色域。

(我认为声称人造图像是sRGB编码的依据是因为这些图像被假定是在sRGB显示器上创作的)

因此,现在您可能可以更好地了解为什么在硬件中特别支持sRGB进行着色器数学输入和图像显示。这是常见的情况。另外,它具有减少感知色带伪影的优点,因此,它是将8位颜色压缩并保持对人类看似合理的好方法。


0

如果允许的值超出0..1范围,那么即使使用sRGB相当有限的基色,您仍然可以解决整个人类的视觉色域。因此,对于存储浮点光源颜色值,使用哪个原色并不重要。但是,进行任何形式的乘法运算都会有些时髦,因为基元的任意坐标充当缩放的“枢轴”。通常使用sRGB primaries,因为传统上您的输入数据是sRGB编码的,而输出显示是sRGB或rec709的。使用rec2020时,其中的一半已经更改,但是目前,大多数输入数据仍可能是sRGB编码的,因此使用与存储相同的主键只是最简单的选择。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.