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


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

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



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

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

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

#1 楼

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

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

人们可能会认为执行两个具有相同基色的渲染,但执行一个使用sRGB编码的渲染/BT.709以及将其编码为DCI-P3,然后将两个结果图像转换为例如ACES2065-1的图像,将产生相同的图像,但事实并非如此。由于线性代数和矩阵的性质,一些数学运算取决于给定的RGB色空间原色,即基于色空间。一旦转换回CIE XYZ颜色空间,在不同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渲染。不包括离群值(例如可见光源),BT.2020原色渲染和BT.709原色渲染的具有光谱渲染的RMSE分别为0.0083和0.0116。

现在,这并不意味着它们将始终性能更好,也许可以提供一些示例,这些示例将偏向BT.709 / sRGB。主要结论是RGB渲染无法与光谱渲染匹配,并且锐利的宽色域往往表现更好。至于选择渲染色彩空间,我会选择一个具有广泛色域的色彩空间,其中包括Pointer的色域,DCI-P3,BT.2020或ACEScg都是最佳的候选。

#2 楼


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


说“ sRGB颜色空间”和“线性化sRGB颜色空间”,以及sRGB规范定义了从一种到另一种的转换。

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

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

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


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


RGB照明无论如何都是近似值,因此不是无论我们选择哪种色域,还是最好选择最接近显示器本身支持的色域?


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

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

评论


$ \ begingroup $
您如何看待这篇文章?如果我没看错的话,它表明在不同的线性颜色空间中进行的计算确实会导致不同的结果。
$ \ endgroup $
– Maxpm
18-10-17在19:47

$ \ begingroup $
@Maxpm:很有意思。我读过的论文是,问题归结为以下事实:光线实际上不适合我们的RGB色彩空间模型。在数学上应该是同一回事的情况下,这会导致不同的视觉结果。在那里,唯一的解决方案似乎是停止使用RGB并开始使用光谱渲染。
$ \ endgroup $
–尼科尔·波拉斯(Nicol Bolas)
18-10-18在1:56

$ \ begingroup $
@Maxpm,但是在所有其他空格都不同之后,它们当然会这样做。但是,RGB不是颜色,所以它是彩色的。但是接下来有一个问题是您想成为正确的人。收益越来越小,
$ \ endgroup $
– joojaa
18-10-18在16:52



#3 楼

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

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

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

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

#4 楼

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