Chapter 8 – Light and Color 光与颜色

8.2 从场景到屏幕

在之后的几个小节中,我们将主要学习PBR。基于一个虚拟的场景,PBR的目标是基于真实世界计算整个场景中的辐射量。而最终我们需要判断back buffer中每一个像素的颜色值。

8.2.1 HDR显示编码

本小节中,我们将重新学习第五章中的知识点,显示编码(display encoding)。在第五章中,我们学习了SDR(standard dynamic range)显示器使用的显示编码,其使用sRGB显示标准,而SDR电视机则使用了Rec. 709和Rec. 1886标准。上述这些标准都有着相同的RGB范围与白点(D65),同时它们的非线性显示编码曲线也较为类似(并非完全一样)。这些标准的白色亮度等级也大体相同(sRGB为80nit,Rec. 709/1886为100nit)。但是显示设备制造商一般不会严格基于此标准来生产设备,产品的白色亮度等级会比标准等级高。

HDR显示则使用Rec. 2020与Rec. 2100标准。Rec. 2020定义的颜色空间的范围更广,如下图所示,而白点的标准(D65)则与Rec. 709和sRGB颜色空间相同。Rec. 2100定义了两种非线性的显示编码:perceptual quantizer(PQ)以及hybrid log-gamma(HLG)。HLG编码在渲染中并不常用,所以我们将专注于PQ,其定义的峰值亮度为10000nit。

虽然对于编码来说,峰值亮度与颜色范围非常重要,但是在实际的显示设备中,这些参数仍未被广泛使用。就现在来说,消费级的HDR显示设备的峰值亮度并不会超过1500nit。而这些设备的颜色显示范围大多接近于DCI-P3而不是Rec. 2020。正是因为这个原因,HDR会进行色调与显示范围的映射,从标准的等级向下映射至实际显示设备所能表现的等级。而应用程序内所设置的实际动态范围与颜色范围将影响这一映射处理。

在应用端,有三种途径将图像转换为HDR显示,但是具体哪一种途径将取决与显示系统与操作系统:

1. HDR10——大多数显示设备都支持这一途径,例如,PC和游戏机设备。backbuffer的格式为每个像素占有32位数据,RGB每个通道占有10位无符号整数位,alpha通道占有2位。其使用PQ非线性编码以及Rec. 2020颜色空间。每一个HDR10显示模块会进行自己的色调映射。

2. scRGB(线性变量)——只有Windows操作系统对其支持。名义上,其使用sRGB色基与白色等级。back buffer的格式为每个通道占有16位数据,且存储线性RGB值。其适用于任何HDR10显示设备,因为驱动会将其转换至HDR10。其主要用于HDR设备向下支持sRGB颜色空间。

3. Dolby Vision——专利格式,仍未被广泛使用。其数据格式为每个通道占有12位数据,并且使用PQ非线性编码和Rec. 2020颜色空间。其显示内部的色调映射是标准化流程。

8.2.2 色调映射(Tone Mapping)

在上一小节和第五章中,我们都提到了显示编码,其过程就是将线性的辐射值转换为显示设备使用的非线性编码值。,并且保证输入的线性值与显示设备的亮度线性辐射相匹配。在第五章中我们并未提到渲染与显示编码之间的一个重要步骤,但在本小节中我们将学习这一点。

色调映射是将场景中的辐射值转换为显示辐射值的过程。这一转换也被成为scene-to-screen转换。色调映射的关键是图像状态(image state)。图像有两个基本的状态。Scene-referred图像是基于场景的辐射值,display-referred图像则是基于显示设备的辐射值。图像的状态与编码无关。两种状态下的图像可以是线性编码的也可能是非线性编码的。下图以图像管线(imaging pipeline)的形式展示了图像状态,色调映射以及显示编码;这一过程从渲染开始处理颜色直到最终显示该颜色。

由上图可知,我们首先绘制基于场景的辐射值,之后Tone Mapping将会把其转换为线性的基于显示设备的辐射值。显示编码(Display Encoding)则会使用逆向的EOTF将线性的基于显示设备的辐射值转换为非线性的编码值,之后非线性值将被传输至显示设备。最后,显示设备会使用EOTF将非线性的数据转换为线性的由屏幕发射的辐射率。

Tone Mapping的目的并不是完全在重现场景中的辐射值。同时,其也并不需要将场景中的HDR颜色值“压榨”为显示设备的LDR颜色值。Tone Mapping更像是一个图像重构的过程。而图像重构的目标则是,基于显示设备的参数以及环境,更好的还原原始的图像。

此外,还有一种图像重构,其目标与上述提到的那些图像重构并不相同,它想要在显示设备上创建看上去更好的图像,而不是完全还原图像。这一过程被称为Preferred image reproduction,我们将在之后的小节学习这方面的知识。

想要将原始场景以类似的视觉感受进行还原是一项非常有挑战的任务,因为有些场景的亮度可能会远远超过显示设备的参数。场景中某些颜色的饱和度可能也会超过显示设备参数。

我们的视觉系统会对不同的亮度进行补偿,正是因为这个因素,我们可以对各种场景进行重构。但是这种补偿并不是完美的,在亮度较低的环境下,我们会觉得场景的对比度较低。

其他因素也会影响到画面重构后的对比度。例如,周围的环境等等。在显示火焰时,我们会对图像进行提亮,以减少实际的对比度。如果我们将要保留原始场景的效果,我们必须对图像显示的对比度与饱和度实行最大化。

然而,对比度的增加会加重另一个问题。因为场景的辐射值范围较于最后显示设备的辐射值范围更大,在重构画面时我们不得不选择一个亮度较小的范围,而超过这一范围的颜色值将被强制变为黑色或者白色。在我们增加对比度之后,相对的,这个范围将变得更小。

Tone Mapping还有一个关键的因素就是曝光(exposure)。在摄影中,曝光指的是控制光线进入传感器的数量。但是,在计算机渲染中,曝光一个线性的缩放处理,其运用在基于场景的图像上,因此在进行tone mapping之前,我们便已经完成了这一操作。而Tone Mapping的重构转换和曝光是紧密相连的。因此Tone Mapping的转换就是针对基于场景的图像的曝光进行设置的。

先对曝光值进行设置,之后再运用Tone Mapping的重构转换,这一过程被称为global tone mapping(全局色调映射),也就是说该映射会运用于屏幕上所有的映射。与其相反,local tone mapping则根据各种因素对不同的像素使用不同的映射转换。实时渲染的应用一般会使用global tone mapping,因此我们主要学习这一类的Tone Mapping。

我们需要注意的是,基于场景的图像与基于显示设备的图像是完全不同的。只有在我们处理基于场景的图像时,那些物理相关的操作与算法才是有效的。由于显示设备的限制,以及各种视觉系统的特点,在两个图像状态之间,我们需要进行非线性的转换。

Tone Reproduction Transform(色调重构转换)

色调重构转换一般是一个一维的曲线,其将基于场景的颜色值转换为基于显示设备的颜色值。该曲线也可以只运用于R,G,B中的一个通道或者运用于亮度。在我们之前的例子中,最后的计算结果将位于显示颜色的范围内,因为基于显示设备的颜色值的RGB三个通道都位于0到1之间。但是,对RGB三个通道进行非线性的转换之后(尤其是我们可能会将颜色值剪裁/clip到0到1的范围内),可能会改变原先的饱和度与色度。根据研究,饱和度的改变并不会影响画面的质量与精确性。但是,色调的改变并不是我们期待的,现在被广泛使用的色调转换则会通过在运用重构转换之后调整RGB的值来减少色调的偏移。

对亮度运用色调映射曲线能够避免或者减少饱和度与色度的偏移。但是,计算后的基于显示设备的颜色值可能超过了RGB颜色范围,在这种情况下,这些越界的变量需要映射回颜色范围。

Tone Mapping的另一个潜在问题是,其可能会影响像素的抗锯齿。

之前被广泛使用的色调重构算法为Reinhard tone reproduction。其不会修正较暗的像素,但是会将较亮的像素设为白色。之后Academy Color Encoding System(ACES)被提出,该系统将scene-to-screen转换分成两个部分。第一个部分被称为reference rendering transform(RRT),其将基于场景的颜色值转换为基于显示设备的颜色值。第二个部分则是output device transform(ODT,输出设备转换),其会将颜色值转换为最终的显示编码。而ODT则会根据具体的显示设备而改变。该技术能够提供多种显示类型。Hart建议,如果我们的应用需要同时支持SDR与HDR显示设备,那么应该使用上述ACES tone mapping技术。

虽然ACES主要运用于电影以及电视行业,其在实时渲染领域的使用率仍然在不断增加。UE4以及Unity都支持该类型的tone mapping。

对于HDR显示设备使用的Tone Mapping需要格外小心,因为一般来说HDR设备还会应用自己的Tone mapping。

Exposure(曝光)

常用的计算曝光的方法需要分析基于场景的亮度值,一般来说,我们会对之前的帧画面进行采样以得到亮度值。

Reinhard建议使用场景亮度的对数平均值。通过该对数平均值,我们求出曝光。但是使用平均值,可能对于那些偏离均值的数据不利,例如,屏幕上一小部分像素的亮度特别高,那么这一小部分像素可能会影响整个帧画面的曝光。后来,使用亮度值的柱状图来缓解该问题。因为柱状图能够求出中位数,其相较于均值更为可靠。

但是上述方法有一个明显的问题,因为我们并不能将像素的亮度作为计算场景曝光的数据。在一些摄影的书籍,中我们可以看到,我们需要通过光线与光源来控制曝光,而不是物体表面的颜色。虽然这种技术在实时渲染领域并不常用,但已经有一些游戏开始使用该技术。MGS5中,启用了基于光源强度的曝光系统。在许多游戏中,美术能够基于不同的环境与场景光照来设置静态的曝光值。

8.2.3 Color Grading(颜色分级)

在上一小节中,我们学习了图像的重构,同时也了解了重构后的图像可能比原始的场景更“漂亮”。而在这一过程中,我们将控制图像的颜色,其也被称为color grading。

Color grading最初运用于电影行业,其控制,或者说改变了场景中的颜色值,使其看上去效果更佳。之后其也运用到了游戏行业中。

Selan提出了将任意颜色值转换至一个三维的颜色查询列表(color lookup table,LUT)。该列表将颜色值的R,G,B作为输入,并且作为x轴,y轴,z轴的坐标值,以此在列表中查询一个新的颜色,作为输出。之后Selan进一步将color grading进一步就行了区分。其一,将color grading运用到基于显示设备的图像数据。而另一种则是将color grading运用到基于场景的图像数据。虽然对基于显示设备的图像数据进行color grading更为简单,但是处理基于场景的图像数据能得到更好的效果。

现在在实时渲染领域,我们更倾向对基于场景的图像进行color grading,因为其效果更好。如下图所示,顶部的图片没有使用color grading,底部的两张图片,左侧是基于显示设备的图像数据的color grading,而右侧是基于场景图像数据的color grading。显然,右侧的效果更佳,天空的阳光更为明显。

在进行LUT的color grading之前,我们需要将基于场景的颜色值映射到范围[0,1]。

 

留下评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据