当前位置: 首页 > news >正文

《Real-Time Rendering》第八章 光与颜色

光与颜色(Light And Color)

  在之前的章节讨论过的许多RGB颜色值都表示光的强度和明暗。在这一章,我们将会了解光的不同物理量,这些物理量相关的知识是学习后续某些章节的基础,这些章节会以一个更加基于物理的角度来讨论渲染。我们也会了解在渲染过程中通常被忽略的另一半过程,即变换表示场景的线性光照值的量到最终的显示颜色。

光的量(Light Quantities)

  走进基于物理的渲染方法的第一步是要以精确的方式量化光。因此,我们首先要了解的是辐射度量学(Radiometry),它是光的物理传输涉及到的核心领域。在这之后我们会了解光度测定(Photometry),它以人眼的敏感度处理光照值。我们对颜色的感知其实是心理物理学现象,即对物理刺激的心理感知。颜色感知会在比色法(Colorimetry)部分进行讨论。最后,我们讨论使用RGB颜色值进行渲染的有效性。

辐射度量学(Radiometry)

  辐射度量学Radiometry)与电磁辐射的测量打交道。正如Section 9.1讨论的那样,这种辐射会以波的形式进行传播。电磁波有着不同的波长Wavelength),它是有着相同相位的相邻点之间的距离。在自然界中,电磁波的波长范围很大,从小于一纳米的百分之一的伽马波一直到极低频率(Extreme Low Frequency,ELF)的有着数万公里波长的无线电波。在这之中,人类可以感知的只有很小的一部分范围,从\(400\)纳米的紫光到\(700\)纳米的红光,一张示例图如下。

img

  辐射量被用于电磁辐射不同方面的度量,比如总体能量、功率、和区域有关的功率密度、方向。这些量如下表所示

img

  在辐射度量学中,基本单位是辐射通量Radiant Flux\(\Phi\),辐射通量是每单位时间的辐射能量,也就是功率\(W\)
辐照度Irradiance)是区域上的辐射通量密度\(d\Phi/dA\)。这个区域可以是空间中想象出的一个区域,但是更通常为物体表面上的区域。它的单位是瓦特每平方米。
在我们了解下一个量之前,我们先介绍立体角Solid Angle)这一概念,它是角度这一概念的三维扩展。角度可以被认为是在一个平面上的连续方向集合的大小的度量,把这些方向投影到单位圆上进行积分,我们就能知道具体的大小。相似的,立体角是三维空间内连续方向集合大小的度量,它的单位为SteradianSr),把这些方向投影到单位球上进行积分,我们就能知道具体的大小。在各种公式中,它一般是使用\(\omega\)符号来表示的。
现在我们可以了解辐射强度Radiant Intensity\(I\),它是方向上的通量密度\(d\Phi/d\omega\),它的单位为瓦每立体角。
最后是辐亮度Radiance\(L\),它是某个方向上的电磁辐射的度量。更确切的说,辐亮度是区域上的与立体角上的辐射通量密度\(d^2\Phi/dAd\omega\)。测量的区域会在一个与方向垂直的平面上。如果是在别的朝向的平面上测量的,那么需要施加余弦修正因子。你有时候可能会遇到使用投影面积这个术语定义的辐亮度,可以把它和修正因子联系起来。
辐亮度是眼睛和相机等传感器会测量的量,因此对于渲染来说是至关重要的。评估着色方程的目的就是计算从表面着色点到相机方向上的辐亮度。\(L\)的值是第五章中了解的\(\mathbf{c}_\text{shaded}\)的物理等价。辐亮度的公制单位是瓦每平方米每立体角。
在一个环境中的辐亮度可以被看作是五个变量(包括波长的话有六个)的函数,这个函数被称为辐亮度分布Radiance Distribution)。其中三个变量定义了位置,另外两个定义了方向。这个函数定义了在空间中传播的光。一个用来思考渲染过程的方式是眼睛和屏幕定义了一个点和一系列方向(穿过每个像素的光线),这个函数会在眼睛所处的位置对每个方向进行评估。在Section 13.4讨论的基于图像的渲染使用了一个相关的概念,叫光场。
在着色方程中,辐亮度通常以\(L_o(\mathbf{x},\mathbf{d})\)\(L_i(\mathbf{x},\mathbf{d})\),下标指代的是从点\(\mathbf{x}\)射出或进入。\(\mathbf{d}\)则指代光线方向,一般来说这个方向都背离点\(\mathbf{x}\)。而对于\(L_i\)这种情况来说,可能会令人困惑,因为\(\mathbf{d}\)指向光传输的相反方向,这其实对于点乘等计算来说有着优势。
辐亮度的一个重要属性是在忽略雾等大气效果的情况下,辐亮度不会受到距离的影响。用另一句话来说,不管表面与观察者相距多远,表面总会有着相同的辐亮度。
绝大多数的光波都包含着许多不同频率的波。这通常可以可视化为光谱功率分布Spectral Power DistributionSPD),它能告诉我们光的能量在不同波长上的分布。下图展示了三个例子

img

尽管中间的分布和底部的分布很不一样,但是最终感知到的颜色却是一样的。在后续的部分我们将会更深入地了解颜色视觉。
所有的辐射量都有着光谱分布。由于这些分布都是波长上的密度,它们的单位因此都是原始的量除以纳米。例如,辐照度的光谱分布有着瓦每平方米每纳米的单位。
整个SPD是很少被用于渲染的,特别是对于那些需要交互性帧率的应用来说,在实践中辐射量都是用RGB三元组来表示的。在后续的部分我们将会解释这些三元组与光谱分布的关系。

光度测定(Photometry)

  辐射度量学与纯物理量打交道,而不涉及人类的感知。一个相关的领域为光度测定Photometry),它和辐射度量学相似,但它会使用人眼的敏感度为一切加权。在这之中,辐射计算的结果都会乘以CIE光度曲线CIE Photometric Curve)来转化为光度单位,这个曲线有着铃铛形状,中心在\(555\)纳米附近,它表示眼睛对不同波长的光的响应。下图为一张示例图

img

  转换曲线和度量单位是光度测定理论和辐射度量学理论的区别所在。每个辐射量都有等价的光度量。下表展示了名称以及单位

img

从逻辑上来说,流明(Lumen)应该作为基本单位,但是坎德拉(Candela)在历史上是第一个被定义的基本单位,其它的单位都是从它得出的。在北美,灯光设计师使用被弃用的叫英尺烛光的度量单位而不是勒克斯(Lux)。不管单位是怎样的,照度(Illuminance)是绝大多数光度计会测量的,而且在照明工程中非常重要。
亮度(Luminance)通常被用来描述平面的亮度。例如,HDR电视屏幕的峰值亮度一般都在500尼特(Nit)到1000尼特之间。作为对比,晴朗的天空有着大概\(8000\)尼特,而一个\(60\)瓦的灯泡有着\(120000\)尼特,在地平线之上的太阳则有着\(600000\)尼特。

比色法(Colorimetry)

  在之前的部分,我们已经了解了人的颜色感知与光的光谱功率分布是强相关的。而且,我们已经知道对应关系不是一对一的,有着不同的光谱功率分布的光被感知后可能有着相同的颜色。比色法研究光谱功率分布和颜色感知之间的关系。
人类大约能区分一千万个不同的颜色。对于颜色感知来说,眼睛通过视网膜上的三种视锥细胞感知颜色,每种视锥细胞对于波长的响应不一样。其它的动物则有着不同数量的颜色视锥细胞。因此,对于给定的SPD来说,我们的大脑只会接收不同的来自视锥细胞的三个信号。这就是为什么使用仅仅三个数字就能精确地表示任何颜色刺激。
但是你可能要问是哪三个数字呢?一些用于颜色度量的标准条件由CIE(Commission Internationale d’Eclairage)提出,颜色匹配实验是根据它们进行的。在颜色匹配中,三个有色光源被投影到白屏幕上,让这些光源的颜色合成到一起并形成一片区域。一个用来匹配的测试颜色会被投影到这个区域附近。测试区域只由单独一个波长的光构成。观察者接着使用旋钮在\([-1,1]\)的范围中分别调整三个有色光源的权重,直到测试颜色与三个有色光源合成的颜色匹配上。一些测试颜色需要负的权重来进行匹配,在这种情况下有色光会施加给测试颜色的区域。下方为r、g、b三种光源的测试结果

img

这些光源都是几乎单色的,它们的能量只分布在很窄的一片区域,r光源在645nm,g光源在526纳米,b光源在444纳米。匹配权重关于测试波长的函数被称为颜色匹配函数Color-matching Function)。
这些函数能把光谱功率分布转化为三个数值。给定某个波长的光,三个有色光的权重可以从图表中得出。而对于特定的光谱分布,可以让分布与三个曲线分别进行积分,计算出三个有色光的权重。大量的不同的光谱分布最终能被映射到相同的三个权重,对于观察者来说感知起来会一样。给予相同的权重的光谱分布被称为同色异谱Metamers)。
r、g、b这三个光源不能直接表示所有可见颜色,因为它们的颜色匹配函数有取负值的地方。CIE提出了三个不同的假想光源的颜色匹配函数,这些假想光源的颜色匹配函数没有取负值的地方。这些函数的曲线是原始的r、g、b颜色匹配函数的线性结合。这要求光源的光谱功率分布在某些波长上取负值,这些光源因此只是数学抽象。我们记它们的颜色匹配函数分别为\(\overline{x}(\lambda)\)\(\overline{y}(\lambda)\)\(\overline{z}(\lambda)\),如下图所示

img

颜色匹配函数\(\overline{y}(\lambda)\)和之前所讲的光度曲线一模一样,辐亮度是使用这条曲线转化为亮度的。
和之前的颜色匹配函数一样,\(\overline{x}(\lambda)\)\(\overline{y}(\lambda)\)\(\overline{z}(\lambda)\)会被用来通过乘法和积分映射任何SPD \(s(\lambda)\)到三个数字,公式如下所示

\[X = \int_{380}^{780} s(\lambda)\overline{x}(\lambda)d\lambda \]

\[Y = \int_{380}^{780} s(\lambda)\overline{y}(\lambda)d\lambda \]

\[Z = \int_{380}^{780} s(\lambda)\overline{z}(\lambda)d\lambda \]

这些X、Y、Z三刺激值Tristimulus)是定义CIE XYZ空间的颜色的权重。对于这些颜色来说可以很便捷地把它们分到亮度和色度Chromaticity)这两个部分。色度是颜色独立于它的亮度的特征。例如,一个亮一点的蓝色和另一个暗一点的蓝色可以有着相同的色度,它们只是亮度不同。
因为这样,CIE通过投影颜色到\(X+Y+Z=1\)平面定义了一个二维的色度空间。如下图所示

img

在这个空间里的坐标被称为\(x\)\(y\),是通过如下的公式计算的

\[\begin{align*} x &= \frac{X}{X+Y+Z}\\ y &= \frac{Y}{X+Y+Z}\\ z &= \frac{Z}{X+Y+Z} = 1 - x - y \end{align*} \]

  在这个空间中,z值没有给予额外的信息,它因此通常被省略。x和y色度坐标的图表被称为CIE 1931 色度图表,如下图所示。

img

图表中的曲线轮廓告诉了我们可见光谱在哪,而光谱尾部连接起来的直线被称为紫线Purple Line)。图表中的黑点显示了标准光源D65的色度,它经常被用作白点,被用来定义白色或无色刺激Achromatic Stimulus)。
总而言之,我们从一个实验开始,这个实验使用三个单波长的光源并测量这些光源需要多少来匹配一些其它波长的光的外表。在一些情况下,这些纯光源需要叠加到被观察的样本上来匹配。这会给予我们一些颜色匹配函数,这些函数没有取负值的地方。有了这些函数,我们可以转换任意的光谱分布到定义了颜色的色度和亮度的XYZ坐标,求出的坐标可以被映射到仅描述色度的xy和常量亮度。
给定一个颜色点\((x,y)\),从白点画一条直线穿过这个点到边界。颜色点相对于白点到光谱边界的距离比例被称为颜色的激发纯度Excitation Purity)。在区域边缘的点定义了主波长(Dominant Wavelength)。这些比色法术语在图形学中已经很少出现了。如今,我们用的是饱和度Saturation)和色相Hue),它们分别与激发纯度和主波长大致相关。饱和度和色相的更精确的定义可以在Stone和一些人的书中找到。
色度图表描述了一个平面。需要用来完全地描述一个颜色的第三维度为\(Y\)值,也就是亮度。xy与Y因此定义了\(xyY\)坐标系统。对于理解颜色如何被用于渲染和渲染系统的限制来说,色度图表是非常重要的。电视和计算机监控器通常使用R、G、B颜色值来显示颜色。每个颜色通道控制着一个发出特定光谱功率分布的光的显示原色Display Primary),每个显示原色都会被与之相关联的颜色值缩放,这些原色发出的光会叠加到一起来构成有着某个光谱功率分布的光,最终被观察者感知到。
在色度图表中的三角形表示电视或计算机监视器的色域Gamut)。三角形的三个角点为原色,它们通常是屏幕能显示的最饱和的红、绿、蓝三色。色度图表的一个重要的属性是这些极限颜色可以使用直线连接起来,来展示显示系统的极限。这些直线表示了混合三个原色能显示的极限颜色。白点表示当R、G、B颜色值相同时显示系统提供的色度。有个很重要的一点是显示系统的整个色域是个三维体。色度图表只是这个三维体的二维投影。感兴趣的读者可以阅读Stone的书籍。
在渲染中有些RGB空间是值得注意的,这些空间都是由R、G、B原色和一个白点定义的。为了比较它们,我们将使用一个不同的色度图表,它叫CIE 1976 UCS图表。这个图表是CIELUV颜色空间的一部分,它被CIE采纳,目的主要在于为XYZ空间提供更高的感知均匀度的替代表示。CIE XYZ空间中感知上差异相同的两种颜色,距离可能相隔20倍。CIELUV在这之上进行了改善,把比率降到了最高四倍。1976图表提供的感知均匀度相比于1931的版本来说能更好地被用来比较RGB空间的色域。对感知均匀的颜色空间的研究最近有了\(\mathrm{IC_TC_P}\)\(\mathrm{J_za_zb_z}\)空间这两个成果。这两个颜色空间比CIELUV有着更高的感知均匀度,特别是对于现代显示器所拥有的高亮度和高饱和度的颜色来说。然而,基于这些颜色空间的色度图表并没有被广泛地接受,我们因此在这个章节中使用CIE 1976 UCS图表。
下图展示了三个颜色空间

img

其中sRGB是迄今为止最常被用于实时渲染中的颜色空间。这里有一点要注意,我们在这个部分使用的“sRGB颜色空间”指代有着sRGB原色和白点的线性颜色空间,而不是我们之前在第五章的显示编码部分讨论的非线性sRGB颜色编码。绝大多数计算机监视器都是为sRGB颜色空间设计的,相同的原色和白点也被Rec. 709颜色空间使用,它被用于HDTV显示器,因此对于游戏主机来说特别重要。然而,更多的显示器有着更广的色域。有些被用来进行图像编辑的计算机显示器会使用Adobe 1998颜色空间。DCI-P3颜色空间最初被开发用于电影制作,在可见的未来有着更广的用途。Apple采纳了这个颜色空间,在iPhone到Mac的整个生产线中进行使用,有其它的一些制造商选择跟随。尽管超高清(Ultra-high Definition,UHD)内容和显示器都规定使用有超宽色域的Rec. 2020颜色空间,在很多情况下DCI-P3也是用于UHD的实际颜色空间。Rec. 2020并没有在上方的图表中显示,但是它的色域和图表中的ACEScg颜色空间很像。ACEScg这个颜色空间由美国电影艺术与科学学院(Academy of Motion Picture Arts and Sciences,AMPAS)开发而来用于电影级计算机图形渲染。它被开发不是被用于显示颜色的空间,而是用于渲染的工作彩色空间Working Color Space),在渲染完成后这个颜色空间内的颜色会被转化为显示颜色。
sRGB颜色空间如今在实时渲染中无处不在,实时渲染在未来也许会使用更多的颜色空间。这对于目标是高色域显示器的应用来说是很大的提升,但是对于目标是sRGB或Rec. 709的显示器的应用也有提升。常规的渲染操作(例如乘法)在不同的颜色空间中执行会有不同的结果,有相关的证据表明在DCI-P3或ACEScg颜色空间执行这些操作会有更精确的结果。
从RGB空间到XYZ空间的转换是线性的,可以通过RGB空间的原色和白点计算出一个矩阵并使用这个矩阵进行变换来做到。通过矩阵的逆和结合,我们可以在不同的颜色空间进行转换。值得注意的是在转换到RGB颜色空间后,RGB值可能会为负或高于一。这些颜色会超出色域,是目标RGB颜色空间无法显示的。有不同的方法可以使用来映射这种颜色到目标RGB色域内。
一个常用的转换是变换RGB颜色到一个灰度亮度值。由于亮度值就是XYZ颜色的Y分量,这个操作其实只和RGB到XYZ转换中RGB到Y部分有关。用另一句话来说就是,RGB点乘RGB到XYZ矩阵的中间一行。对于sRGB和Rec. 709来说就是

\[Y = 0.2126R + 0.7152G + 0.0722B \]

  比色法告诉了我们两个颜色刺激是否匹配,但是却无法预测它们的外表。给定的XYZ颜色刺激还严重依赖于光照、周围的颜色、过去一段时间的情况等因素。颜色外表模型Color Appearance Model)就比如CIECAM02则尝试研究这些问题,并预测颜色的最终外表。
颜色外表建模是一个更大的颜色感知的领域,它涵盖了遮蔽Masking)这种效应。它是为什么高频高对比度的在一个物体上的图案倾向于掩盖缺陷的原因。用另一句话来说就是,一个波斯地毯的纹理会帮助伪装色带和其它的着色伪影,因此可以少花点功夫在这种表面上。

使用RGB颜色进行渲染(Rendering with RGB Colors)

  严格地来说,RGB值表示感知而不是物理量。从技术的角度上来说,将它们用于基于物理的渲染是错误的。正确的方法是对光谱量进行渲染计算,并在最后通过一些操作将计算出来的量转化为RGB颜色。
例如,最常见的渲染操作是计算从某个物体反射的光。对于不同的波长来说,物体反射的量会不一样,这是通过光谱反射率曲线Spectral Relfectance Curve)来描述的。严格正确的计算反射光的颜色的方法是将入射光的SPD在每个波长乘以光谱反射率,这么做我们就得到了反射光的SPD,接着可以把它转化为RGB颜色。在一个RGB渲染器中,光的RGB颜色和表面的RGB颜色会相乘,来得到反射光的RGB颜色。一般来说,这不会给予正确的结果。我们可以看看一个比较极端的一个例子,如下图所示

img

  这个例子展示了用于激光投影仪的屏幕材质。它在与激光投影仪匹配的窄波段上有着高的反射率,而在其它波长有着低反射率。这让其反射大部分来自投影仪的光,同时又吸收大部分来自其它光源的光。这是一个RGB渲染器做不到的事。
正如我们之前所说,这个例子太过极端。在实际生活中遇到的表面都会有着光滑得多的光谱反射率曲线,就像下图那样

img

典型光源的SPD会和标准光源D65的SPD相似而不会和之前所说的激光投影仪的SPD相似。当光源和表面的SPD都平滑时,使用RGB渲染带来的错误将会相对来说很小。
预测性渲染Predictive Rendering)应用中,这些小错误是很重要的。例如,在同一光源的作用下,两个光谱反射率曲线可能有着相同的颜色外表。这个问题被称为同色异谱失配Metameric Failure)或光源同色异谱Illuminant Metamerism),比如当油漆维修车身部位的时,这个问题需要被关注。如果有应用场景需要预测这种效果类型,那么RGB渲染是不适用的。
然而,对于大部分的目的不是进行预测性模拟的渲染系统来说,RGB渲染的效果是非常好的。电影的离线渲染最近才开始实施光谱渲染,而且距离频繁使用还有很长一段时间。
这个部分只是触及了颜色科学的基础,主要在于建立光谱与颜色三元组之间的关系的一些认知,并讨论设备的一些限制。在后续的部分,一个相关的话题,即变换渲染的场景颜色到显示值将会被讨论。

场景到屏幕(Scene to Screen)

  这本书后续的章节将会专注于基于物理的渲染会遇到的问题。对于给定的一个虚拟场景来说,基于物理的渲染的目标是计算辐亮度,让场景像是真的存在。然而,离这件事完成还有很长一段距离。在被显示的帧缓冲中的像素值仍然需要被决定。在这个部分,我们将会了解在像素值的决定中需要考虑的事情。

高动态范围显示编码(High Dynamic Range Display Encoding)

  第五章的显示编码讨论了标准动态范围(SDR)监视器的显示编码,这些监视器通常使用sRGB显示标准,而SDR电视则使用Rec. 709和Rec. 1886标准。这些标准都有着相同的RGB色域和D65白点,而且都使用相似的非线性显示编码曲线。它们也有着大致相似的参考白亮度等级(sRGB为\(80 \; \mathrm{cd/m^2}\),Rec. 709和Rec. 1886为\(100 \; \mathrm{cd/m^2}\))。这些亮度规定没有被监视器和电视生产厂商严格遵循,在实际的生产制造中这些生产商倾向于使用更亮的白等级。
HDR显示器使用Rec. 2020和Rec. 2100标准。Rec. 2020定义了一个有着显著更广的颜色域的颜色空间,这个颜色空间和Rec.709还有sRGB颜色空间一样使用了D65作为白点。Rec. 2100定义了两个非线性显示编码,分别为感知量化Perceptual QuantizerPQ)和混合对数伽马Hybrid Log-gammaHLG)。HLG编码在渲染中没有被频繁用到,我们因此在这里聚焦于PQ,它定义了\(10000 \; \mathrm{cd/m^2}\)的峰值亮度。
尽管峰值亮度和色域规范对于编码这一目的来说很重要,这些规范在一定程度上更像是目标值,而非当前显示设备的实际能力。在这本书写作的时候,只有少数消费级HDR显示器有着超过\(1500 \mathrm{cd/m^2}\)的峰值亮度等级。这些显示器的显示色域会相比于Rec. 2020更接近DCI-P3。正是因为这样,这些HDR显示器会从标准规范降级,根据实际的显示能力进行内部的色调和色域映射。这个映射可以受到应用传输的用来指定内容的实际动态范围和色域的元数据的影响。
从应用的视角看,有以下三种途径可以被用来传输图像到HDR显示器上,取决于具体的显示器和操作系统,这三个途径也许并不会都能被使用

  1. HDR10:它被HDR显示器和PC还有主机操作系统广泛地支持。帧缓冲格式为每像素32比特位,其中RGB通道中的每个通道有着10比特位,阿尔法通道有2比特位。它使用PQ非线性编码和Rec. 2020颜色空间。

  2. scRGB(线性变体):只被Windows操作系统支持。通常来说会使用sRGB原色和白点亮度,两者都能被超出因为标准支持小于\(0\)和大于\(1\)的RGB值。帧缓冲的格式是每通道16比特位,并且存储线性RGB值。它可以和任意的HDR10显示器一起使用,因为驱动会转换内容到HDR10。它主要的优势是便捷以及对于sRGB有向后兼容性。

  3. 杜比视界(Dolby Vision):它是一个专有的格式,在(这本书写作的时期)显示器或主机中还没有被广泛地支持。它使用了一个定制的每通道12比特位的帧缓冲格式,并使用PQ非线性编码和Rec. 2020颜色空间。显示器的内部色调映射在模型之间都是标准化的。

Lottes指出实际上还有第四选项。如果曝光和颜色能被仔细调整,那么HDR显示可以通过一般的SDR内容来驱动并获得好结果。
如果使用scRGB之外的选项,那么作为显示编码的一步,应用需要从渲染的工作空间转换像素RGB值到Rec. 2020,这要求使用一个\(3 \times 3\)的矩阵进行变换并应用PQ编码,这比Rec. 709或sRGB编码函数要昂贵。Patry给予了PQ曲线的一个不昂贵的近似方法。在HDR显示器上合成用户界面(User Interface,UI)的元素需要被关注,因为需要确保用户界面是清晰可辨并且有适宜的亮度等级。

色调映射(Tone Mapping)

  在之前的部分我们讨论过显示编码,即转换线性辐亮度值到非线性的编码值用于显示硬件。在这个过程中被应用的函数是电光传递函数(EOTF)的逆,它保证输入线性值会有线性输出。我们之前的讨论含糊略过了渲染和显示编码之间的重要一步,现在我们能探索它。
色调映射Tone Mapping)或色调再现Tone Reproduction)是转换场景的辐亮度到显示辐亮度值的过程。这一步会应用的变换被称为端到端传递函数End-to-end Transfer Function)或场景到屏幕变换Scene-to-screen Transform)。图像状态Image State)这一概念是理解色调映射的关键。有两种基本的图像状态。场景参考Scene-referred)图像被定义为场景辐亮度值的参考,而显示参考Display-referred)图像被定义为输出辐亮度值的参考。图像状态和编码无关。在任意状态的图像可以被线性或非线性编码。下图展示了图像状态、色调映射、显示编码在成像管线Imaging Pipeline)中是如何被组合到一起的,成像管线处理从最初的渲染到最终显示的颜色值。

img

  关于色调映射这一目标有一些常见的误解。场景到屏幕的变换不是恒等变换,它不会在显示器上完美再现场景的辐亮度值。它也不从高动态范围“挤压”每一比特的数据到更低的动态范围用于显示,尽管场景和显示器的动态范围的区别确实是很重要的一部分。
为了理解色调映射的目标,不妨思考图像的再现的一个例子。图像再现的目标是创建尽可能让观察者感觉好像真的身临其境在观察原始场景的显示参考图像。下图是个相关的例子

img

  有一种类型的图像再现和这个目标有略微区别。偏好图像再现Preferred Image Reproduction)旨在创建一个在某种意义上比原始场景看起来更好的显示参考图像。它会在后续的部分被讨论。
制造身临其境感是有挑战的,考虑到典型场景中的亮度范围会超过显示器显示能力数个数量级。场景中一些颜色的饱和度也可能远超显示器的能力。不管怎样,摄影、电视、电影都会尝试生成原始场景的感知相似性,文艺复兴时期的绘画师也是如此。这背后其实是对人类视觉系统的某些属性的利用。
视觉系统会对绝对的亮度值进行补偿,这一能力被称为适应Adaptation)。在其作用下,在昏暗的房间内的屏幕上再现的室外场景能产生和原始场景相似的感知,尽管再现的亮度只有原始的不到\(1\%\)。然而,适应提供的补偿是不完美的。在更低的亮度等级,感知的对比度会降低(史蒂文斯效应),感知的“色彩度”也一样(亨特效应)。
其它的因素也影响着实际或再现的感知的对比度。显示器的周围环境会使感知对比度升高或降低。显示炫光Display Flare)是种不被期望的效果,光照通过显示器的瑕疵或屏幕反射被叠加到显示的图像上,导致了图像的实际对比度的降低,改变的程度一般都会相当大。这些效果意味着我们必须提升显示参考图像值得对比度和饱和度,来尽可能保留与原始场景的相似的感知效果。
然而,对比度的提升会加剧一个已知的问题。由于场景的动态范围一般比显示的大得多,我们因此只能选择亮度值的一个窄窗口进行再现,让那些在窗口之上或之下的值被裁剪到黑或白。进一步提升对比度会让窗口变窄。为了在一定程度上缓解裁剪带来的效果,一个软的平滑压缩会被用来让阴影和高光的一些细节回归。
这些最终导致了一个S形的色调再现曲线,和光学胶片会有的类似。这并不是巧合。光化学胶片乳剂的特性被Kodak的研究者和其它公司细心地调整来获得有效的令人满意的图像再现效果。因为这些原因,“电影风格”通常在色调映射的讨论中出现。
曝光Exposure)对于色调映射来说是个极其重要的概念。在摄影中,曝光指代控制落到胶片或传感器上的光的量。然而在渲染中,曝光是个线性缩放的操作,它会应用于场景参考图像,先于色调再现变换。曝光棘手的一点是要决定缩放因子。色调再现变换和曝光是紧密连接在一起的。色调变换一般都假设场景参考图像已经被曝光过了。
曝光缩放接着再进行色调再现变换的过程是全局色调映射Global Tone Mapping)的一种类型,在全局色调映射中相同的映射会作用于所有像素。与之相对的是局部色调映射Local Tone Mapping),每个像素会有不同的映射,这取决于周围的像素和其它的因素。实时应用几乎都使用全局色调映射,我们因此聚焦于这种类型,首先讨论色调再现变换,接着再讨论曝光。
要记得的一点是场景参考图像和显示参考图像究其本质是不一样的。物理操作只对场景参考数据有用。由于显示器的限制和不同的感知效果,非线性变换通常被需要来在两种图像状态之间进行变换。

色调映射变换(Tone Reproduction Transform)

  色调映射变换通常都表示为映射场景参考输入值到显示参考输出值的一维曲线。这些曲线可以独立应用于R、G、B值或亮度。对于前者来说输出值会处于显示色域中,因为显示参考的RGB通道值都会介于0到1之间。然而,对RGB通道值执行非线性操作(尤其是裁剪)可能导致饱和度和色相的偏移,此外还可能有期望的亮度偏移。Giorgianni和Madden指出饱和度的偏移对感官来说是有益的。绝大多数再现变换使用的用来对抗观看环境眩光效应等因素的对比度提升方法会导致饱和度的相应提升,这也会对抗亨特效应。然而,色相的偏移一般是不被期望的,现代的色调变换一般会在应用色调曲线后进行一次额外的调整来降低色相。
通过对亮度应用色调曲线,色相和饱和度的偏移可以被避免(或至少被降低)。然而,处理后的显示参考颜色可能位于显示器的RGB色域外,在这种情况下需要被映射回来。
对场景参考像素值应用非线性函数会对某些抗走样技术造成问题。这些问题会在后续的部分进行讨论。
Reinhard色调映射运算是被用于实时渲染的色调变换方法。它让暗值几乎不变,而让更亮的值逐渐趋向于白色。一个有点相似的色调映射运算由Drago等人提出,这个方法能对输出的显示亮度进行调整,这让其更适用于HDR显示器。Duiker创造了Kodak胶片响应曲线的一个近似曲线,用于视频游戏。这个曲线随后被Hable修改,为用户提供了更多的控制,它被游戏Uncharted 2使用。Hable提出的这个曲线具有影响力,一个以他为名的叫“Hable电影风格曲线”的曲线被一些游戏使用。Hable后续提出了一个新的曲线,这个曲线相比于他早期的成果有着更多的优势。
Day提出了一个S形色调曲线,它被用于Insomniac Games的作品和游戏Call of Duty:Advanced Warfare中。Gotanda创造了一个模拟胶片和数字相机传感器的响应的一些色调变换。这些色调变换被用于Star Ocean 4和其它游戏中。Lottes指出显示炫光对显示器的有效动态范围的影响是显著的,并且高度依赖于房间的光照条件。正是因为这样,为用户提供色调映射的调整功能是十分重要的。他提出了一个支持调整的色调再现变换,而且能被用于SDR和HDR显示器。
学院颜色编码系统Academy Color Encoding SystemACES)由美国电影艺术与科学学院科学与技术委员会创造,作为电影工业和电视产业管理颜色的标准。ACES系统把场景到屏幕变换分成了两个部分。第一个部分是参考渲染变换Reference Rendering TransformRRT),它会把场景参考值变换到一个设备无关的被称为输出颜色编码规范Output Color Encoding SpecificationOCES)的输出空间。第二个部分是输出设备变换Output Device TransformODT),它会把来自OCES的颜色值转化到最终的输出编码。ODT有很多不同的类型,每个都是被设计用于某个特定的显示设备和观看条件。RRT和合适的ODT就构成了整个变换。使用这个模块化系统可以应对不同的显示器类型和观看条件。Hart建议ACES色调映射变换用于那些需要同时支持SDR和HDR显示器的应用。
尽管ACES是被设计用于电影和电视的,它实时应用中的使用也在增长。ACES色调映射是Unreal Engine启用的默认设置,在Unity引擎中也被支持。Narkowicz 提供了一些对 ACES RRT(结合 SDR 和 HDR ODT)进行拟合的低成本曲线,Patry也是这么做的。Hart提出了一个ACES ODT的参数化版本来支持一系列的设备。
HDR显示器的色调映射需要注意,因为显示器会应用它们自己的色调映射。Fry提出了一些在Frostbite游戏引擎中使用的色调映射变换。对于SDR显示器来说使用的都是一些相对激进的色调再现曲线,而对于使用HDR10信号路径的显示器则没那么激进,对于使用杜比视界路径的显示器来说没有色调映射。Frostbite色调再现变换被设计来变得中立,让对比度或色相在显示器之间的改变不那么显著。目的是让任何期望的对比度或色相的修改通过调色应用。为了这么做,色调再现变换是在\(\mathrm{IC_TC_P}\)颜色空间中应用的,这个颜色空间被设计有感知一致性和色度与亮度轴之间的正交性。Frostbite的色调映射对亮度进行,在亮度逐渐压缩到显示白点时,逐渐降低色度的饱和度。这提供了一个简洁而又没有色相偏移的变换。
讽刺的是,有些资源(如火焰效果)需要在之前的变换中利用色相偏移,Frostbite团队最终修改了变换,使用户能重新引入一定程度的色相偏移到显示参考颜色上。下图是Frostbite变换与这个部分提到的其它变换的比较

img

曝光(Exposure)

  常用的一簇计算曝光的技术依赖于分析场景参考亮度值。为了避免停滞,这个分析一般都通过采样前一帧完成。
在Reinhard等人的建议后,被用于早期的实现的一个度量为对数平均场景亮度。一般来说,曝光是通过计算每帧的对数平均值来决定的。对数平均是通过执行一系列的降采样后处理通道计算的,直到最后一的单独的值被计算出来。
平均值对于离群值很敏感,数量较少的亮像素能产生较大的影响。后续的一些实现通过使用亮度值的直方图来缓解。直方图允许计算中位数,这个方法因此有更高的健壮性。直方图中额外的数据点可以被用来改善结果。例如,在Valve的Orange Box中,基于第95百分位和中位数的启发式方法被用来决定曝光。Mittring讨论了使用计算着色器来生成亮度直方图。
目前讨论的技术有个问题,像素亮度其实是错误的曝光驱动度量。如果我们观察一些摄影的实践,比如Ansel Adams的Zone系统,了解入射光度计是如何被用于设置曝光的。那么很快就会发现,其实更好的方法是单独使用光照来决定曝光。这么做有效是因为,摄影中的曝光是被用来对抗光照的。这会导致最终的成像主要显示物体表面的颜色,与人类视觉系统的颜色恒常Color Constancy)属性对应。这样处理曝光也能确保正确的值被传递到色调变换。例如,绝大多数被用于电影或电视产业的色调变换都被设计映射曝光后的场景参考值0.18到显示参考值0.1,这基于0.18表示主光照条件下的18%灰卡的这一预期。
尽管这个方法在实时应用中还不常见,在未来应该会有相关的使用。例如,游戏Metal Gear Solid V:Ground Zeros有个基于光照强度的曝光系统。在许多游戏中,静态的曝光等级会基于环境中的已知光照条件被手动设置。这么做能避免了曝光的意外变化。

调色(Color Grading)

  在前一个部分我们提到了偏好图像再现这一概念,它的意思是生成在某种意义上比原始场景更好的图像。一般来说,这涉及创意性的图像颜色的调整,这一过程被称为调色Color Grading)。
数字颜色调色被用于影视产业已经有一段时间。早期的例子包括电影O Brother, Where Art Thou? (2000)和Am´elie (2001)。调色通常是通过交互式地操纵一个样例场景图象的颜色直到图像达到期望的外观做到的。相同的操作接着会应用于所有图像。调色从影视传播到了游戏,它在如今被广泛地使用。
Selan展示了如何“烘焙”任意的从某个调色或图像编辑应用到一个三维颜色查找表(LUT)的颜色变换。这种表接受输入的R、G、B值,并将值分别作为x、y、z坐标用于在表中查找新颜色,这些表因此可以被用于任意的输入颜色到输出颜色的映射,只要在LUT的分辨率限度内。Selan的烘焙过程通过先从一个恒等LUT(映射每个输入颜色到相同的颜色)开始,并将其“切片”创造一个二维的图像。切片后的LUT图像接着被加载到一个调色应用中,定义了一个期望的创意外观的操作会应用于它。对LUT应该只施加颜色操作,必须避免模糊这种空间上的操作。编辑后的LUT接着被保存,并被“打包”到一个三维GPU纹理上,渲染应用能利用它在运行时为被渲染的像素执行相同的颜色变换。Iwanicki提出了使用最小二乘法这个更巧妙的方法来减少存储颜色变换到LUT时会遇到的采样问题。
在后续的发布中,Selan区分了两种实现调色的方法。在第一种方法中,调色会对显示参考图像数据执行。在另一个方法中,调色会对通过显示变换预览的场景参考数据执行。尽管显示参考的调色方法更容易建立,但是调色场景参考数据能生成更有保真度的结果。
当实时应用采纳了调色时,显示参考方法位于主导地位。然而,场景参考的方法自那以后也开始流行,因为通过它能获得更高的视觉质量。下图是一个相关的例子

img

注解:上方的图像没使用调色,而另外两张分别使用了极端的调色操作用于展示。可以看到右边使用场景参考数据的调色方法更好。

对场景参考数据应用调色也提供了节省一些计算的机会,可以把色调映射曲线烘焙到调色LUT中,如游戏Uncharted 4所做的那样。
在LUT查找前,场景参考数据必须被重新映射回\([0,1]\)的范围。Frostbite引擎使用了感知量化OETF来这么做,更简单的曲线也可以被使用。Duiker使用了一个对数曲线,而Hable建议应用平方根运算一到两次。
Hable对常见的调色操作和这些操作的实现考量进行了一个好的概述。

http://www.jsqmd.com/news/760415/

相关文章:

  • 论文写作“数据魔法师”:书匠策AI的神奇数据分析之旅
  • 别再只用平均值了!用Python的sklearn玩转分位数回归,预测区间更靠谱
  • 2026年至今辽宁超声波热量计实力工厂盘点,如何选择高精度产品? - 2026年企业推荐榜
  • TWINFLOW框架:大语言模型自对抗推理技术解析
  • 2026年Q2北京学校防静电地板采购指南:为何石家庄东晨地板厂是可靠源头之选? - 2026年企业推荐榜
  • 2026年5月广东省下走膜枕式包装机选购指南:聚焦实力厂商广东省嘉谦机械制造有限公司 - 2026年企业推荐榜
  • CVAT 3D标注实战:手把手教你用长方体标注点云数据(附Velodyne格式处理)
  • 2026年5月市面上上海代办德国公司GmbH注册有哪些厂家推荐榜,3家代表性机构选择指南 - 海棠依旧大
  • 微生物组多组学分析Pipeline崩溃于R 4.5?——紧急排查清单(内存泄漏定位/Seurat v5冲突/AnVIL云环境适配失败)
  • 【限时公开】Nature Microbiology审稿人私藏R代码库:含57个已验证的图形模板(含热图/网络图/轨迹图/菌群互作图)
  • 2026届最火的AI写作网站解析与推荐
  • Dify 2026多模态RAG架构重构实录(内部技术简报解密版):如何用单Agent调度3类视觉编码器+2类语音解码器+1套统一语义桥接层
  • Windows ECS 远程桌面连接提示凭证不工作如何解决?
  • 开放世界学习中的细粒度诊断与双轨知识蒸馏技术
  • 2026方碗机选型全攻略:方杯机/方碗机/智能纸杯纸碗机/纸容器智能工厂整体解决方案/纸杯机生产线/装箱机/高速外包机/选择指南 - 优质品牌商家
  • 【Dify农业知识库本地化部署实战指南】:20年专家亲授3大避坑法则、4步极速上线、零基础也能当天跑通
  • Mio框架:实现200ms低延迟数字人多模态交互
  • KMS_VL_ALL_AIO:企业级Windows与Office智能激活架构深度解析
  • 2026年5月比较好的贵阳高性价比零食店哪家好厂家推荐榜,休闲零食集合店、量贩式零食店、社区零食超市、品牌折扣零食店厂家选择指南 - 海棠依旧大
  • Perfex CRM技能管理模块:实现基于员工能力的智能任务分配
  • TranslucentTB:3分钟让你的Windows任务栏焕然一新
  • 别再被Python的list.remove()报错搞懵了!3种安全删除元素的实战写法(附代码对比)
  • Cloudpods:统一多云管理与AI应用部署的开源云管平台实践
  • 5分钟掌握R3nzSkin:英雄联盟国服免费换肤终极指南
  • 2026年5月有实力的滨州铝液除气精炼机厂家怎么选厂家推荐榜,固定式/移动式精炼机厂家选择指南 - 海棠依旧大
  • PHP生成式AI代码风险爆发前夜:3类高危漏洞自动识别+实时阻断方案(附GDPR/等保2.1合规对照表)
  • 2026年5月更新:北京地区漂珠耐火风管优质生产厂商深度评估与口碑推荐 - 2026年企业推荐榜
  • Dify医疗合规调试SOP(v2.4.1):含FDA 21 CFR Part 11电子签名验证模板、审计追踪配置checklist及监管迎检话术库
  • 高频脉冲电源厂家选择:放心供应商筛选策略解析
  • 10个AIAgent同时干活,效率飙升9倍