Real-time Rendering 第八章 光与颜色

前几章讨论的许多RGB颜色值表示光的强度和渲染。在本章中,我们将学习由这些值测量的各种物理光量子,为后面的章节打下基础,这些章节将从更物理的角度讨论渲染。我们还将学习更多关于渲染过程中经常被忽视的“后半部分”:表示场景线性光量的颜色转换为最终显示颜色。

8.1 光量——Light Quantities

任何基于物理的渲染方法的第一步都是精确地量化光线。首先介绍辐射测量学,因为这是涉及光的物理传输的核心领域。我们接着讨论了光度学,它处理的是由人眼灵敏度加权的光值。我们对颜色的感知是一种心理物理现象:对物理刺激的心理感知。颜色感知在比色法一节中讨论。最后,我们讨论了RGB颜色值渲染的有效性。

8.1.1 辐射线测定 —— Radiometry

辐射测量学研究的是电磁辐射的测量。正如将在9.1节中更详细地讨论的那样,这种辐射以波的形式传播。不同波长的电磁波——具有相同相位的两个相邻点之间的距离,例如两个相邻的波峰——具有不同的性质。在自然界中,电磁波的波长范围很广,从长度不到百分之一纳米的伽马波到长达数万公里的极低频(ELF)电波。人类能看到的光波只是这个范围的一小部分,从400纳米的紫光到700多纳米的红光。参见图8.1。

Real-time Rendering 第八章 光与颜色_第1张图片
image
Real-time Rendering 第八章 光与颜色_第2张图片
image

辐射测量量用于测量电磁辐射的各个方面:总体能量、功率(随时间变化的能量)和相对于面积、方向或两者的功率密度。这些数量列于表8.1。

在辐射测量、基本单位辐射通量,Φ。辐射通量是辐射能随时间-功率的流动,以瓦特(W)为单位测量。

辐照度是辐射通量相对于面积的密度,即。dΦ/ dA。辐照度是根据面积来定义的,面积可以是空间中想象的面积,但通常是物体的表面。它的单位是瓦特每平方米。

在讨论下一个量之前,我们需要先介绍立体角的概念,它是角概念的三维扩展。一个角度可以被认为是一个平面上连续的方向集的大小的度量,其弧度的值等于这个方向集与半径为1的封闭圆相交的弧的长度。类似地,立体角测量三维空间中连续的方向集合的大小,测量单位为steradians(缩写为“sr”),其定义为半径为1的封闭球体上的相交斑块的面积[544]。固体角是由符号ω表示。

在两个维度,一个2π弧度角覆盖整个单位圆。这延伸到三维空间,4π的立体角球面度将覆盖整个地区的单位球。一个立体角的大小可以在图8.2中看到。

Real-time Rendering 第八章 光与颜色_第3张图片
image

现在我们可以介绍辐射强度,这是通量密度对方向更准确地说,固体角(dΦ/ dω)。它的单位是瓦特每斯特拉迪安(watts/steradian)。

最后,辐射强度L是单一射线中电磁辐射的量度。更准确地说,它被定义为辐射通量密度对区域和固体角(d2Φ/ dAdω)。这个面积是在垂直于射线的平面上测量的。如果辐射是应用到一个表面在其他方向,那么余弦校正因子必须使用。您可能会遇到使用术语“投影面积”定义辐射度的情况。

辐射率是传感器(如眼睛或照相机)测量的值(详细信息请参阅9.2节),所以它对于渲染来说是最重要的。计算阴影方程的目的是计算从阴影面点到摄像机的沿给定光线的亮度。沿着这条射线的L值是第5章中所述的基于物理的量从cshaded的等价物。辐射的公制单位是瓦特每平方米每steradian。

环境中的辐射可以看作是五个变量(或六个,包括波长)的函数,称为辐射分布[400]。其中三个变量指定位置,另外两个指定方向。这个函数描述了所有的光在空间中移动。一种理解呈现过程的方法是,眼睛和屏幕定义一个点和一组方向(例如,一条射线通过每个像素),然后在眼睛处对每个方向进行评估。第13.4节讨论的基于图像的渲染使用了一个相关的概念,称为光场。

在渲染方程中,辐度通常以Lo(x,d)或Li(x,d)的形式出现,这意味着辐度分别从x点出去或进入x点。方向向量d表示射线的方向,根据惯例,射线的方向总是指向远离x的方向。虽然在Li的情况下,这个惯例可能有点令人困惑,因为d指向与光传播相反的方向,因此对于点积之类的计算很方便。

辐射的一个重要特性是它不受距离的影响,忽略了大气的影响,如雾。换句话说,不管与观察者的距离有多远,一个表面都会有相同的亮度。距离越远,表面覆盖的像素越少,但每个像素处的表面辐射是恒定的。

大多数光波包含许多不同波长的混合物。这是一个典型的光谱功率分布(SPD),这是一个显示光的能量如何分布在不同波长的图。图8.3显示了三个示例。值得注意的是,尽管在图8.3中,中间和底部SPD之间存在显著差异,但它们被认为是相同的颜色。很明显,人类的眼睛不适合使用光谱仪。我们将在8.1.3节中详细讨论颜色视觉。

Real-time Rendering 第八章 光与颜色_第4张图片
image

所有辐射量都有光谱分布。由于这些分布是密度在波长上的分布,它们的单位是原始量除以纳米。例如,辐照度的光谱分布的单位是瓦特每平方米每纳米。

由于完整的SPD很难用于呈现,特别是在交互速率下,因此在实践中辐射量被表示为RGB三元组。在8.1.3节中,我们将解释这些三元组与光谱分布的关系。

8.1.2 光度法——Photometry

放射测量学只研究物理量,不考虑人的感知。一个相关的领域,光度学,就像辐射测量学一样,除了它是通过人眼的敏感度来衡量一切的。辐射计算的结果通过乘以CIE光度曲线转换为光度单位,1是一个以555 nm为中心的钟形曲线,表示眼睛对不同波长的光的响应[76,544]。参见图8.4。

Real-time Rendering 第八章 光与颜色_第5张图片
image

转换曲线和测量单位是光度学理论和辐射测量理论的唯一区别。每个辐射量都有一个等效的米制光度量。表8.2显示了每一个的名称和单元。单位都有预期的关系(例如,勒克斯是流明每平方米)。虽然从逻辑上讲内腔应该是基本单位,但从历史上看,内腔被定义为一个基本单位,其他单位都是从它派生出来的。在北美,照明设计师使用废弃的英制计量单位英尺烛光(fc)来测量照度,而不是照度。无论哪种情况,照度都是大多数照度计所测量的,在照明工程中是很重要的。

亮度通常用来描述平面的亮度。例如,高动态范围(HDR)电视屏幕的峰值亮度通常在500到1000 nits之间。相比之下,晴空的亮度约为8000 nits, 60瓦灯泡的亮度约为12万nits,地平线处的太阳亮度约为60万nits[1413]。

Real-time Rendering 第八章 光与颜色_第6张图片
image

8.1.3 比色法——Colorimetry

在第8.1.1节中,我们已经看到,我们对光的颜色的感知与光的SPD(光谱功率分布)紧密相连。我们也看到这不是简单的一对一对应。图8.3中的底部和中间SPD完全不同,但被认为是完全相同的颜色。比色法研究光谱功率分布与颜色感知之间的关系。

人类可以分辨大约1000万种不同的颜色。对于颜色感知,眼睛是通过视网膜上三种不同类型的锥体感受器工作的,每种类型的感受器对不同的波长有不同的反应。其他动物有不同数量的颜色感受器,在某些情况下多达15个[260]。因此,对于一个给定的SPD,我们的大脑只从这些受体接收到三种不同的信号。这就是为什么只有三个数字可以用来精确表示任何颜色刺激的原因[1707]。

但是哪三个数字呢?CIE (Commission Internationale d ‘Eclairage)提出了一套测量颜色的标准条件,并使用它们进行了颜色匹配实验。在配色时,三种不同颜色的光投射在白色屏幕上,使它们的颜色叠加在一起形成一个色块。与此补丁匹配的测试颜色被投影到此补丁旁边。测试色块是单一波长的。观察者可以使用校准到加权范围[−1,1]的旋钮来改变三种颜色的光,直到测试颜色匹配。需要负权值来匹配一些测试颜色,这样的权值意味着将相应的光添加到波长的测试色块中。图8.5中显示了三种灯(r、g和b)的一组测试结果。灯几乎是单色,每个狭隘的能量分布集中在一个波长:645 nm r, g 526海里,444 nm b。每一组相关的函数匹配的重量测试补丁波长称为比对功能。

Real-time Rendering 第八章 光与颜色_第7张图片
image

这些函数给出了一种将光谱功率分布转换为三个值的方法。给定单一波长的光,三种不同颜色的光设置可以从图形中读取,旋钮设置,创建的照明条件将从屏幕上的两束光产生相同的感觉。对于任意的光谱分布,颜色匹配函数可以乘以每个结果曲线下的分布和面积(即,积分)给出相对的数量,设置彩色的光,以匹配感知到的颜色产生的光谱。相当不同的光谱分布可以分解为相同的三个权值,即在观察者看来,它们是一样的。赋予匹配权值的谱分布称为元模型。

三种加权的r、g、b灯不能直接代表所有可见的颜色,因为它们的配色函数对不同的波长都有负的权值。CIE提出了三种不同的假设光源,它们的颜色匹配函数对所有可见波长都是正的。这些曲线是原始的r、g和b颜色匹配函数的线性组合。这就要求光源的光谱功率分布在某些波长为负,因此这些光是不可实现的数学抽象。他们比对功能表示x(λ),y(λ)和z(λ),如图8.6所示。比对函数y(λ)是一样的光度曲线(图8.4),由于辐射转换成亮度曲线。

Real-time Rendering 第八章 光与颜色_第8张图片
image

与前一组比对功能,x(λ),y(λ)和z(λ)是用来减少任何SPD(λ)通过乘法和集成三个数字:

image

这些X、Y和Z三刺激值是在CIE XYZ空间中定义颜色的权重。把颜色分为亮度和色度通常是很方便的。色度是指颜色与亮度无关的特性。例如,两种深浅不同的蓝色,一种暗的,一种亮的,可以有相同的色度,尽管亮度不同。

为此,CIE通过在X + Y + Z = 1平面上投射颜色来定义一个二维色度空间。参见图8.7。这个空间中的坐标称为x和y,计算如下:

Real-time Rendering 第八章 光与颜色_第9张图片
image
Real-time Rendering 第八章 光与颜色_第10张图片
image

z值没有提供其他信息,因此通常省略它。色度坐标x和y的坐标图被称为CIE 1931色度图。参见图8.8。图中曲线的轮廓表示可见光谱的颜色所在,而连接光谱两端的直线称为紫色线。黑点表示光源D65的色度,这是一个常用的白点——色度用来定义白色或无色(无色)刺激。

总而言之,我们从一个实验开始,这个实验使用了三种单波长的光,并测量了每一种光需要多少来匹配其他波长的光。有时,这些纯光必须添加到正在查看的样本,以匹配。这就给出了一组颜色匹配函数,将它们组合起来创建一个没有负值的新集合。有了这个非负的颜色匹配函数集,我们可以将任何光谱分布转换为定义颜色的色度和亮度的XYZ坐标,该坐标可以简化为xy来描述色度,从而保持亮度不变。

Real-time Rendering 第八章 光与颜色_第11张图片
image

给定一个颜色点(x,y),画一条线从白点通过这个点到边界(光谱或紫色线)。色点与区域边缘距离的相对距离即为激发纯度。区域边缘上的点定义了主波长。这些比色术语在图形中很少见。相反,我们使用饱和度和色相,它们分别与激发纯度和主波长松散相关。关于饱和度和色调的更精确的定义可以在Stone[1706]和其他人[456,789,1934]的书中找到。

色度图描述了一个平面。第三个需要完全描述颜色的维度是Y值,亮度。这些定义了所谓的xy坐标系。色度图对于理解如何在渲染中使用颜色以及渲染系统的限制非常重要。电视或计算机显示器通过使用R、G和B颜色值的某些设置来显示颜色。每个颜色通道控制一个显示主屏幕,主屏幕发出具有特定光谱功率分布的光。三原色的每一种都按其各自的颜色值进行缩放,并将它们叠加在一起,以创建观察者所感知到的单一光谱功率分布。

色度图中的三角形表示典型电视或计算机显示器的色域。三角形的三个角是三原色,三原色是屏幕可以显示的最饱和的红色、绿色和蓝色。色度图的一个重要特性是这些有限的颜色可以用直线连接起来,以显示整个显示系统的极限。这些直线代表了通过混合这三种三原色可以显示的颜色的界限。白点表示当R、G和B的颜色值相等时,显示系统产生的色度。需要注意的是,显示系统的全部范围是一个三维体。色度图只显示了这个体积在二维平面上的投影。更多信息参见Stone的书[1706]。

有几个感兴趣的RGB空间用于呈现,每个空间由R、G和B三原色和一个白点定义。为了比较它们,我们将使用一种不同类型的色度图,称为CIE 1976 UCS(均匀色度标度)图。该图是CIELUV颜色空间的一部分,CIE(以及另一个颜色空间CIELAB)采用了该颜色空间,其目的是为XYZ空间提供更一致的替代方案[1707]。在CIE XYZ空间中,相同数量的可感知差异的颜色对在距离上可能相差20倍。CIELUV在此基础上进行了改进,将比率降低到最高4倍。这种增强的感知一致性使得1976年的图比1931年的图要好得多,这是为了比较RGB空间的宽度。对感知一致的颜色空间的持续研究最近产生了ICTCP[364]和Jzazbz[1527]空间。与CIELUV相比,这些颜色空间在感知上更均匀,特别是对于现代显示器的高亮度和饱和颜色。然而,基于这些颜色空间的色度图还没有被广泛采用,因此我们在本章中使用CIE 1976 UCS图,例如在图8.9中。

Real-time Rendering 第八章 光与颜色_第12张图片
image

在图8.9所示的三个RGB空间中,sRGB是目前为止实时渲染中最常用的。值得注意的是,在本节中,我们使用“sRGB颜色空间”来表示具有sRGB三原色和白点的线性颜色空间,而不是在5.6节中讨论的非线性sRGB颜色编码。大多数计算机显示器是为sRGB颜色空间设计的,同样的pri- maries和白点也适用于Rec. 709颜色空间,它用于高清电视显示器,因此对游戏机很重要。然而,更多的显示器是用更广泛的游戏。一些用于照片编辑的计算机显示器使用adobe1998颜色空间(未显示)。最初用于故事片制作的DCI-P3彩色空间正在得到更广泛的应用。苹果在从iphone到mac的产品线中都采用了这种颜色空间,其他制造商也纷纷效仿。虽然超高清(UHD)内容和显示器被指定为使用极宽色域Rec. 2020颜色空间,但在许多情况下,DCI-P3实际上也是UHD的颜色空间。图8.9没有显示Rec. 2020,但是它的色域非常接近图中第三个颜色空间ACEScg。ACEScg颜色空间是由美国电影艺术与科学学院(AMPAS)开发的,用于电影计算机图形绘制。它不打算用作显示的颜色空间,而是用作呈现的工作颜色空间,在呈现后将颜色转换为适当的显示颜色空间。

虽然目前sRGB颜色空间在实时渲染中无处不在,但更广泛的颜色空间的使用可能会增加。最直接的好处是针对宽色域显示的应用程序[672],但是即使针对sRGB或Rec. 709显示的应用程序也有优势。当在不同的颜色空间中执行乘法等常规呈现操作时,会得到不同的结果[672,1117],而且有证据表明,在DCI-P3或ACEScg空间中执行这些操作比在线性sRGB空间中执行这些操作产生更准确的结果[660,975,1118]。

从RGB空间到XYZ空间的转换是线性的,可以用RGB空间的初级和白点导出的矩阵来完成[1048]。通过矩阵反转和连接,可以导出矩阵来将XYZ转换成任何RGB空间,或者在两个不同的RGB空间之间进行转换。注意,在这样的转换之后,RGB值可能为负,也可能大于1。这些是超出色域的颜色。,在目标RGB空间中不可复制。可以使用各种方法将这些颜色映射到目标RGB色域[785,1241]。

一种常用的转换是将RGB颜色转换为灰度亮度值。由于亮度与Y系数相同,因此此操作只是rgb – xyz转换的“Y部分”。换句话说,它是RGB系数和RGB- xyz矩阵中间行之间的点积。对于sRGB和Rec. 709空间,公式为[1704]

image

这又把我们带到了光度曲线,如图8.4所示,在271页。这条曲线代表了一个标准观察者的眼睛如何对不同波长的光做出反应,它乘以三个三原色的光谱功率分布,每条结果曲线都被整合。这三个结果的权重构成了上面的亮度方程。灰度强度值不等于红色、绿色和蓝色的原因是眼睛对不同波长的光有不同的敏感度。

比色法能告诉我们两种颜色刺激是否匹配,但不能预测它们的外观。给定的XYZ颜色刺激的外观在很大程度上取决于照明、周围颜色和以前的条件等因素。CIECAM02等颜色外观模型(CAM)试图处理这些问题并预测最终的颜色外观[456]。

颜色外观建模是更广泛的视觉感知领域的一部分,包括mask等效果[468]。这就是物体上高频、高对比度的图案往往隐藏缺陷的地方。换句话说,像波斯地毯这样的纹理将有助于掩盖色带和其他渲染瑕疵,这意味着在这些表面上需要花费更少的渲染工作。

8.1.4 用RBG色渲染——Rendering with RGB Colors

严格地说,RGB值代表的是感知量,而不是物理量。使用它们进行基于物理的渲染在技术上是一个类别错误。正确的方法是对光谱量进行所有的渲染计算,要么通过密集采样,要么在合适的基础上投影,最后才转换成RGB颜色。

例如,最常见的渲染操作之一是计算从对象反射的光线。物体的表面通常反射某些波长的光比其他波长的多,这是由它的光谱反射率曲线所描述的。严格正确的计算反射光颜色的方法是将入射光的SPD乘以每个波长的光谱反射率,得到的反射光SPD将被转换成RGB颜色。相反,在RGB渲染器中,灯光和表面的RGB颜色相乘,得到反射光的RGB颜色。在一般情况下,这不会给出正确的结果。为了说明这一点,我们将查看一个有点极端的示例,如图8.10所示。

Real-time Rendering 第八章 光与颜色_第13张图片
image

我们的例子展示了一种设计用于激光投影仪的屏幕材料。它具有高反射率的窄波段匹配激光投影仪波长和低反射率的大多数其他波长。这导致它反射大部分来自投影仪的光,但吸收大部分来自其他光源的光。在这种情况下,RGB渲染器会产生严重的错误。

然而,图8.10所示的情况远非典型。实际中遇到的曲面的光谱反射率曲线要光滑得多,如图8.11所示。典型的光源spd类似于D65光源,而不是在例子中的激光投影仪。当光源SPD和表面光谱反射率均为光滑时,RGB渲染引入的误差相对较小。

Real-time Rendering 第八章 光与颜色_第14张图片
image

在预测渲染应用程序中,这些细微的错误可能很重要。例如,两个光谱反射率曲线在一个光源下可能有相同的颜色外观,但在另一个光源下却没有。这一问题被称为异色故障或发光体异色现象,例如在油漆修复后的汽车车身部件时就会引起严重的关注。RGB渲染在试图预测这种类型效果的应用程序中是不合适的。

然而,对于大多数的渲染系统,特别是那些交互应用程序,它们的目的并不是产生预测模拟,RGB渲染的效果出奇的好[169]。即使是影视离线渲染也只是最近才开始使用光谱渲染,目前还远未普及[660,1610]。

本节只涉及到颜色科学的基础知识,主要是为了使人们意识到光谱与颜色三联体的关系,并讨论设备的局限性。下一节将讨论与此相关的主题,即如何转换呈现的场景颜色来显示值。

8.2 场景到屏幕

本书接下来的几章主要讨论基于物理的渲染问题。给定一个虚拟场景,基于物理的渲染的目标是计算在真实场景中出现的亮度。然而,在这一点上,工作还远远没有完成。最后的结果——显示的帧缓冲区中的像素值——仍然需要确定。在这一节中,我们将讨论与此决定有关的一些注意事项。

8.2.1 高动态范围显示编码

本节的内容建立在第5.6节的基础上,第5.6节讨论了显示编码。我们决定将高动态范围(HDR)显示的覆盖推迟到本节,因为它需要一些主题的背景知识,比如颜色gamuts,这在那部分书中还没有讨论过。

第5.6节讨论了标准动态范围(SDR)显示器的显示编码,标准动态范围显示器通常使用sRGB显示标准,而SDR电视则使用Rec. 709和Rec. 1886标准。这两套标准具有相同的RGB色域和白点(D65),并且有一些相似(但不相同)的非线性显示编码曲线。它们也有大致相似的参考白色亮度水平(sRGB为80 cd/m2, Rec为100 cd/m2。这些亮度规范并没有得到显示器和电视制造商的严格遵守,他们实际上倾向于生产具有更亮的白电平的显示器[1081]。

HDR显示器使用Rec. 2020和Rec. 2100标准。Rec. 2020定义了一个颜色空间,其色域明显更宽,如图8.12所示,并且与Rec. 709和sRGB颜色空间具有相同的白点(D65)。Rec. 2100定义了两个非线性显示编码:感知量化器(PQ)[1213]和混合log-gamma (HLG)。HLG编码在渲染场景中使用的并不多,因此我们将重点关注PQ,它定义了10,000 cd/m2的峰值亮度值。

尽管峰值亮度和色域规范对于编码目的很重要,但就实际显示而言,它们多少有些不切实际。在撰写本文时,很少有消费者级HDR显示器的峰值亮度水平超过1500 cd/m2。实际上,与Rec. 2020相比,显示gamuts更接近于DCI-P3(如图8.12所示)。因此,HDR显示器执行从标准规范到实际显示功能的内部色调和色域映射。这种映射可能受到应用程序传递的元数据的影响,这些元数据指示内容的实际动态范围和范围[672,1082]。

Real-time Rendering 第八章 光与颜色_第15张图片
image

从应用程序方面来看,有三种路径可以将图像传输到HDR显示,但是根据显示和操作系统的不同,这三种路径并不都是可用的:

  1. hdr10广泛支持HDR显示器以及PC和控制台操作系统。帧缓冲区格式是每像素32位,每个RGB通道有10个无符号整数位,alpha通道有2个无符号整数位。它使用PQ非线性编码和Rec. 2020颜色空间。每个HDR10显示模型都执行自己的tone mapping,这种映射没有标准化或文档化。

  2. 仅支持Windows操作系统上的scRGB(线性变体)。名义上它使用sRGB三原色和白电平,尽管两者都可以超过,因为标准支持小于0和大1的RGB值。framebuffer格式为每个通道16位,存储线性RGB值。它可以与任何HDR10显示,因为驱动程序转换到HDR10。它主要用于方便和向后兼容sRGB。

  3. Dolby vision -专有格式,在显示或任何控制台(撰写本文时)还没有得到广泛支持。它使用自定义的12位每通道帧缓冲格式,并使用PQ非线性编码和Rec. 2020颜色空间。显示内部色调映射是跨模型标准化的(但不是文档化的)。

Lottes[1083]指出实际上还有第四种选择。如果仔细调整曝光和颜色,HDR显示器可以通过常规的SDR信号路径驱动,效果很好。

scRGB以外的任何选项,作为display-encoding步骤的一部分,应用程序需要将像素的RGB值呈现工作空间Rec。2020——需要一个3×3矩阵变换和应用PQ encod——荷兰国际集团(ing),这是比Rec更昂贵的。[497]709或sRGB编码功能。Patry[1360]给出了一个PQ曲线的廉价近似值。在HDR显示器上合成用户界面(UI)元素时需要特别小心,以确保用户界面清晰,并且处于舒适的亮度级别[672]。

8.2.2 色调映射——Tone Mapping

在第5.6和8.2.1节中,我们讨论了显示编码,即将显示硬件的线性辐射值转换为非线性代码值的过程。显示编码所应用的函数与显示的电光传递函数(EOTF)是相反的,它保证了输入的线性值与显示所发出的线性辐射相匹配。我们在前面的讨论中忽略了呈现和显示编码之间的一个重要步骤,现在我们准备探讨这个步骤。

色调映射或色调再现是将场景亮度值转换为显示亮度值的过程。在此步骤中应用的转换称为端到端传输函数,或场景到屏幕转换。图像状态的概念是理解色调映射的关键[1602]。有两种基本的象态。场景参考图像在参考场景辐射值中定义,显示参考图像在参考场景辐射值中定义。图像状态与编码无关。两种状态下的图像可以线性编码,也可以非线性编码。图8.13显示了在处理从初始渲染到最终显示的颜色值的成像管道中,图像状态、色调映射和显示编码如何配合在一起。

Real-time Rendering 第八章 光与颜色_第16张图片
image

关于色调映射的目标有几种常见的误解。它不是为了确保场景到屏幕的转换是一个统一转换,完美地在显示器上重现场景亮度值。它也不是将每一个比特的信息从场景的高动态范围“挤压”到显示的低动态范围,虽然描述场景和显示动态范围之间的差异确实起到了重要的作用。

要理解色调映射的目标,最好将其视为图像复制的一个实例[757]。图像复制的目标是创建一个尽可能接近的显示图像,即在给定的显示属性和观看条件下复制的参考图像,即观察者在观察原始场景时会产生的感知印象。参见图8.14。

image

有一种图像复制有一个稍微不同的目标。首选图像复制的目的是创建一个显示参考图像,在某种意义上,看起来比原来的场景更好。稍后将在8.2.3节中讨论首选图像再现。

考虑到一个典型场景的亮度范围超出了显示能力几个数量级,再现与原始场景相似的感知印象的目标是一个具有挑战性的目标。场景中至少有一些颜色的饱和度(纯度)也可能远远超过显示能力。尽管如此,摄影、电视和电影确实能像文艺复兴时期的画家那样,使人对原始场景产生令人信服的感性的相似性。这一成就是通过利用人类视觉系统的某些特性实现的。

视觉系统弥补了绝对亮度的差异,这是一种适应能力。由于这种能力,在一个昏暗的房间里,屏幕上显示的户外场景的再现可以产生与原始场景相似的感觉,尽管再现的亮度低于原始场景的1%。然而,适应机制提供的补偿机制并不完善。在较低的亮度水平下,感知到的对比度降低(史蒂文斯效应),以及感知到的“色彩”(亨特效应)。

其他因素影响繁殖的实际或感知的对比。显示器的周围环境(显示矩形外的亮度水平,例如房间照明的亮度)可能增加或减少感知到的对比度(巴特尔松-布伦曼效应)。显示耀斑是一种不需要的光,它通过显示缺陷或屏幕反射添加到显示图像中,通常在相当大的程度上降低了图像的实际对比度。这些效果意味着,如果我们想要保留与原始场景类似的感知效果,我们必须提高显示参考图像值的对比度和饱和度[1418]。

然而,这种对比的增加加剧了一个现存的问题。由于场景的动态范围通常比显示的大得多,我们必须选择一个狭窄的亮度值窗口来重现,窗口上下的值被裁剪为黑色或白色。增强对比会进一步缩小这个窗口。为了在一定程度上抵消暗部和亮部的剪裁,我们使用了柔和的滚动来将一些阴影和高光的细节带回来。

所有这些导致了s型(s形)的色调再现曲线,类似于光化学薄膜[1418]所提供的曲线。这并非偶然。柯达和其他公司的研究人员仔细调整了光化学胶片乳化液的性能,以产生有效和令人愉悦的图像再现效果。由于这些原因,形容词“filmic”经常出现在色调映射的讨论中。

曝光的概念是至关重要的色调映射。在摄影技术中,曝光指的是控制落在胶片或传感器上的光量。然而,在渲染中,曝光是在色调再现变换应用之前对场景参考图像进行的线性缩放操作。曝光的棘手之处在于决定应用什么比例因子。色调的复制、变换和曝光是紧密联系在一起的。色调转换的设计通常是期望它们能应用于以某种方式暴露的场景参考图像。

按曝光比例缩放,然后应用色调再现变换形式的过程是一种全局色调映射,其中相同的映射应用于所有像素。相反,局部色调映射过程使用不同的像素到像素的映射,基于周围像素和其他因素。实时应用程序几乎只使用全局色调映射(有几个例外[1921]),因此我们将重点讨论这种类型,首先讨论色调复制转换,然后讨论曝光。

重要的是要记住场景引用的图像和显示引用的即时消息是根本不同的。物理操作仅在对场景引用的数据执行时有效。由于显示的局限性和我们讨论过的各种感知效果,这两种图像状态之间总是需要进行非线性变换。

色调复制转换——Tone Reproduction Transform

色调再现变换通常表示为一维曲线,将场景参考的输入值映射到显示参考的输出值。这些曲线可以单独应用于R、G和B值或亮度。在前一种情况下,结果将自动出现在显示色域中,因为每个显示引用的RGB通道值都在0到1之间。然而,在RGB通道上执行非线性操作(尤其是剪裁)可能会导致饱和度和色调的变化,以及所需的亮度变化。Giorgianni和Madden[537]指出,饱和度的变化在感知上是有益的。大多数复制转换使用的对比度增强来抵消史蒂文斯效应(以及环绕和观看耀斑效应)将导致相应的饱和度增强,这也将抵消狩猎效应。然而,色调转换通常被认为是不受欢迎的,现代色调转换试图通过在色调曲线之后应用额外的RGB调整来减少这种变化。

通过将色调曲线应用于亮度,可以避免色相和饱和度的变化(或至少减少)。但是,结果显示引用的颜色可能超出了显示的RGB色域,在这种情况下需要将其映射回。

调映射的一个潜在问题是,将一个非线性函数应用于场景参考像素颜色可能会导致一些反走样技术的问题。这个问题(以及解决它的方法)将在5.4.2节中讨论。

Reinhard tone reproduction操作符[1478]是实时渲染中较早使用的色调转换之一。它使较暗的值基本保持不变,而较亮的值逐渐变为白色。Drago等人[375]提出了一种有点类似的色调映射运算符,该运算符具有调整输出显示亮度的能力,这可能使其更适合HDR显示。Duiker创造了一种近似柯达胶卷响应曲线[391,392]用于视频游戏。这条曲线后来被Hable[628]修改,增加了更多的用户控制,并被用于游戏《神秘海域2》。在这条曲线上,耐波的表现是有影响力的,导致“耐波电影曲线”在一些游戏中被使用。后来,与他早期的工作相比,Hable[634]提出了一种新的曲线。

Day[330]呈现了一条sigmoid音调曲线,这条曲线曾用于《失眠症游戏》和《使命召唤:高级战争》的游戏。Gotanda[571, 572]创建了模拟胶片和数码相机传感器响应的音调转换。这些都是在Star Ocean 4和其他游戏中使用的。Lottes[1081]指出,显示器耀斑对显示器有效动态范围的影响是显著的,并且高度依赖于室内照明条件。因此,为用户提供对色调映射的调整非常重要。他提出了一种色调复制转换,支持这种调整,可以用于SDR和HDR显示器。

学院色彩编码系统(ACES)是由美国电影艺术与科学学院的科学技术委员会创建的,作为管理电影和电视行业色彩的标准。ACES系统将场景到屏幕的转换分为两部分。第一个是reference rendering transform (RRT),它将场景引用的值转换为与设备无关的标准输出空间(称为output color encoding specification (OCES))中的显示引用值。第二部分是输出设备转换(ODT),它将颜色值从OCES转换为最终的显示编码。有许多不同的odt,每个odt都是为特定的显示设备和查看条件设计的。RRT和适当的ODT的连接将创建整个转换。这种模块化结构便于处理各种显示类型和查看条件。Hart[672]建议将ACES音调映射转换用于需要同时支持SDR和HDR显示的应用程序。

虽然ACES是为电影和电视设计的,但是它的变形技术在实时应用中的应用越来越多。ACES tone mapping在Unreal Engine[1802]中是默认启用的,Unity Engine也支持它[1801]。Narkowicz用SDR和HDR ODTs[1260, 1261]以及Patry[1359]给出了适合ACES RRT的廉价曲线。Hart[672]提出了ACES odt的参数化版本,以支持各种设备。

使用HDR显示器进行色调映射需要一些注意,因为显示器也将应用它们自己的色调映射。Fry[497]提出了一组用于Frostbite游戏引擎的音调映射转换。他们申请一个相对积极的语气特别提款权繁殖曲线显示,不那么咄咄逼人的显示使用HDR10信号路径(与一些变化基于显示器的亮度峰值),和没有色调映射显示使用杜比视觉路径(换句话说,他们依靠内置杜比视觉色调映射应用的显示)。冻伤色调再现变换被设计成中性,没有显著的对比或色调变化。目的是通过颜色分级(第8.2.3节)应用任何所需的对比度或色调修改。为此,在ICTCP颜色空间中应用了色调再现变换[364],该颜色空间的设计是为了在色度轴和亮度轴之间实现感知的均匀性和正交性。Frostbite转换色调-映射亮度,并随着亮度逐渐变为白色而逐渐降低色度。这提供了一个干净的转换,没有色调的变化。

具有讽刺意味的是,在编写了一些资产(比如火焰效果)来利用之前转换中的色调变化之后,Frostbite团队最终修改了转换,使用户能够重新引入一定程度的色调变化到显示引用的颜色。图8.15显示了冻伤转换与本节中提到的其他几个转换的对比。

image

曝光——Exposure

计算曝光的一个常用技术家族依赖于分析场景参考亮度值。为了避免引入停顿,此分析通常通过对前一帧进行抽样来完成。

根据Reinhard等人[1478]的建议,早期实现中使用的一个度量是对数平均场景亮度。通常,曝光是通过计算帧的对数平均值来确定的[224,1674]。这个log-average是通过执行一系列向下采样的后处理遍历来计算的,直到最后计算出帧的单个值。

使用平均值往往对异常值过于敏感,例如,少量的亮像素可能会影响整个帧的曝光。后来的实现通过使用亮度值的直方图改进了这个问题。直方图可以计算中位数,而不是平均值,中位数更接近反破产。直方图中额外的数据点可以用来改进结果。例如,在Valve的Orange Box中,基于第95百分位数和中位数的启发法被用来确定曝光率[1821]。Mittring描述了如何使用计算着色器来生成亮度直方图[1229]。

到目前为止讨论的技术的问题是像素亮度是驱动曝光的错误度量。如果我们观察摄影实践,例如Ansel Adams的区域系统[10]和入射光度计如何设置曝光,很明显,使用单独的照明(没有表面反照率的影响)来确定曝光是更好的选择[757]。这样做是有效的,因为,以第一近似值来看,摄影曝光是用来抵消光线的。这就产生了一种主要显示物体表面颜色的打印效果,它与人类视觉系统的颜色恒常性相一致。以这种方式处理曝光还可以确保将正确的值传递到色调转换。例如,电影或电视行业中使用的大多数色调转换都是将暴露的场景参考值0.18映射到显示参考值0.1,期望0.18表示主导场景照明中的18%灰度卡[1418,1602]。

虽然这种方法在实时应用程序中还不常见,但它已经开始得到应用。例如,游戏《Metal Gear Solid V: Ground Zeroes》便拥有基于灯光强度的曝光系统[921]。在许多游戏中,静态曝光水平是根据已知的场景照明值为环境的不同部分手动设置的。这样做可以避免曝光的意外动态变化。

8.2.3 颜色分级——Color Grading

在8.2.2节中,我们提到了首选图像再现的概念,即在某种意义上生成比原始场景更好的图像。通常这涉及到对图像颜色的创造性处理,这一过程被称为颜色分级。

数字色彩分级已在电影行业中使用了一段时间。早期的例子包括电影《Brother, Where Art Thou?》(2000),́埃利(2001)。色彩分级通常是通过交互操作的颜色在一个例子的场景图像,直到所需的创造性“外观”是实现。然后,在一个镜头或序列中的所有图像上重新应用相同的操作序列。颜色分级从电影传播到游戏,现在广泛使用[392,424,756,856,1222]。

Selan[1601]展示了如何将颜色分级或图像编辑应用程序中的任意颜色转换“烘焙”成三维颜色查找表(LUT)。通过使用输入R、G和B值作为x-、y-和z-坐标来应用这些表,以便在表中查找新颜色,因此可以用于从输入到输出颜色的任何映射,直到LUT的分辨率受到限制。Selan的烘焙过程从获取一个标识LUT(将每个输入颜色映射到相同颜色的标识)并“切片”它来创建一个二维图像开始。然后,将这个切片的LUT图像加载到颜色分级应用程序中,并将定义所需的创造性外观的操作应用到它。注意只对LUT应用颜色操作,避免空间操作,如模糊。然后,编辑后的LUT被保存出来,“打包”到一个三维GPU纹理中,并用于渲染应用程序,动态地对渲染像素应用相同的颜色转换。Iwanicki[806]提出了一种利用最小二乘最小化将颜色转换存储在LUT中以减少采样误差的巧妙方法。

在后来的发表中,Selan[1602]区分了执行颜色分级的两种方法。一种方法是对显示参考图像数据进行颜色分级。另一种方法是对通过显示转换预览的场景引用数据执行颜色分级操作。虽然显示参考的颜色分级方法更容易建立,分级场景参考的数据可以产生更高的保真度的结果。

当实时应用程序第一次采用颜色分级时,显示参考方法占主导地位[756,856]。然而,场景参考方法由于其较高的视觉质量而获得了越来越多的关注[198,497,672]。参见图8.16。对场景参考数据应用颜色分级还提供了将色调映射曲线烘焙到分级LUT中来节省一些计算的机会[672],正如在游戏《Uncharted 4》中所做的那样[198]。

Real-time Rendering 第八章 光与颜色_第17张图片
image

在LUT查找之前,场景引用的数据必须重新映射到 0,1范围。在Frostbite引擎[497]中,感知量化器OETF用于此目的,尽管可以使用更简单的曲线。Duiker[392]使用对数曲线,Hable[635]建议使用一次或两次应用的平方根运算符。

你可能感兴趣的:(Real-time Rendering 第八章 光与颜色)