文章概览和个人读后感
在这个“人均光线追踪”的时代,色彩和HDR这个话题讨论的人却不多,一方面是该话题听起来不如光线追踪那么吸引人,二是对于国内的市场来说(大部分是手游)确实不需要过于注重这一方面的应用。
但随着目前国内更多3A端游项目的设立、游戏开发朝着工业化和3A化的不断发展,以及肯定的是,未来肯定HDR显示器的天下(虽然不知道要多久)。HDR和色彩管理这个话题会慢慢变得重要起来。
本篇总结笔记基于对动视研究中心的《HDR in Call of Duty》的学习。
如果之前从来没有了解过相关的内容,要完全理解原文或是有点难度的,因此我在笔记中对原文没有解释非常清楚的地方做了一些额外的注解。
该文章内容主要分两部分,一是关于动态范围、光和颜色等的科学前置知识,这一部分辅以了非常生动形象的动画(个人推荐看看原PPT的动画),这一块是我觉得最有价值的部分。 第二部分是关于游戏《COD:WW2》中新的HDR管线的具体实现,这一部分我没有做太多的注解,因为它的新管线是有考虑对旧管线的兼容情况的,对新项目未必每一台细节都需要, 我个人觉得在遇到具体问题时进行一定的参考即可。
Electromagnetic Spectrum and Light Spectrum (电磁频谱和光谱)
光是一种电磁波,可见光波长在380~780 nm (纳米)。
一束可见光分布着许多不同波长的光子,这个分布叫光谱。通过三棱镜,可以分解光得到光谱。 我们可以将光谱用spectral power distribution (SPD)(光谱能量分布)表示,SPD展示了光在每种波长下的强度。
Color Vision(色觉)
Trichromatic Vision(三色视觉)
人眼拥有3中类型的cone receptor cells(视椎细胞),它们对不同的波长的光有不同的响应,形成了(三色视觉),三种类型的视椎细胞为:
- (L)ong
- (M)edium
- (S)hort
故名思义,它们分别对长、中、短波长响应最强烈。
由于我们的大脑只接受这三种细胞感知的颜色,因此可以用3个强度数值表示我们的感知结果。
注:不同的光谱是可以产生相同的感知颜色的,这叫条件等色。
Luminosity Function(光度函数)
强度不变的情况下,处于光谱不同位置的可见光,我们感知到的亮度也不同。
通常情况下,在强度一样的情况下,人眼感知绿色的亮度比红蓝要亮。
描述不同波长的光和人眼感知亮度之间关系的函数,叫做Luminosity Function(光度函数)。
当我们说Intensity,即强度时,如果我们测量的是电磁辐射,则使用Radiometric units(辐射测量单位)。
辐射测量单位用光度函数加权后,用来表示我们人眼感知到的亮度,即Photometric units(光度单位)。
Color Matching Experiments(颜色匹配实验)
为了发现光和色觉的关系,科学家进行了颜色匹配实验。
首例实验发生在1850,由James Clark Maxwell(麦克斯韦)实施。在1920年代末期,William David Wright 和 John Guild分别独立地实施了这些实验。
实验过程是将一台测试颜色,monochromatic light (单色光)家用投影到白色的屏幕上,在屏幕另一边调节其他几个单色光红、绿、蓝使得其组合表现的跟测试颜色相同:
有的时候,红、绿、蓝单色光无法组合出和测试颜色相同的结果。此时在测试颜色一端添加一台负数颜色2进行抵消:
对不同波长的单色可见光进行测试,并且取多个观察者的平均值可以得到一台表格或转化为函数图像。这些结果就被称为颜色匹配函数:
尽管颜色匹配函数表示的是单个波长的光对应的红绿蓝强度,但由于自然光的叠加性质,我们实际上可以匹配任意光谱的感知颜色。
通过缩放这些曲线的y值,我们可以表示光的不同强度。
总结,对一台光谱分布(下图白),将其每个波长对应的光谱强度* 该波长对应的颜色匹配函数值:
得到了曲线下的一台区域:
然后我们将所有波长的计算结果进行积分(即该区域的面积),就得到3个数值,用这3个数值强度的RGB单色光叠加色就和原始光谱的颜色一样。
1931年,CIE (the International Commission on Illumination) 根据此实验结果制定了一系列的标准,颜色匹配函数也叫CIE 1931 Standard Observer。
Color Space(颜色空间)
CIE 1931 RGB Color Space
将CIE RGB颜色匹配函数的R G B视为3D空间的坐标轴。对于单波长的光,我们可以获得其颜色匹配函数结果的3个数值,即3D空间中的某个点。将所有频率对应点都画出来后,就会得到了一台曲线,即spectral locus(光谱轨迹)。
将光谱轨迹家用投影到原点,并扩展到无限远,我们可以得到一台表示各种波长各种强度的单色光的Volume Space体积空间。
这个空间就包括了所有我们通过混合不同波长的光后能感知到的颜色,即CIE 1931 RGB 颜色空间:
CIE 1931 XYZ Color Space
在前面的颜色匹配实验中,是有负数的存在的,因此CIE RGB颜色空间也会有负值。
为了消灭负数,CIE从定义一台从RGB颜色空间衍生出来XYZ颜色空间,RGB和XYZ空间可以通过一台简单的线性矩阵变换得到。
XYZ颜色空间的特点:
- 没有负数
- Y轴是特意选择的,等于luminosity function(光度函数),即亮度。因此Y值越大,亮度越高。
- RGB空间的每个坐标轴都是物理上的波长,但XYZ空间的坐标轴是没有物理意义的,因此XYZ颜色也叫做想象或假设的颜色。
- 当把XYZ空间家用投影到X+Y+Z = 1的平面上后形成xyz颜色空间,此时x和y的取值范围会在[0,1],且在x+y=1的直线以内,见下文。
CIE 1931 xyz Color Space
有时我们只关心颜色的chromaticity 或hue,即色调。通常我们的表示方法是将XYZ空间的颜色家用投影到X+Y+Z = 1的平面上,这样得到的空间叫做xyz 颜色空间(注意小写):
由于xyz空间的点都满足关系 x+y+z = 1,因此只需要记录两个值,另外一台值可以推算出来。通常是保存xy值,丢弃z值。通过xy值,我们知道了颜色的色调。
有时除了xy值,我们还保存家用投影前的Y值,这样使得我们可以通过xy,和Y3个值还原该颜色在XYZ空间的坐标。
色度图
XYZ家用投影到x+y+z=1平面后的xy形成的空间叫做CIE xy颜色空间,或chromaticity diagram色度图:
色度图的最外圈马蹄形状,即光谱轨迹,表示单波长光的感知颜色。马蹄内的区域表示不同波长混合的感知颜色。
注意其x和y取值范围是[0,1],并且在x+y=1的直线以内,这是XYZ颜色空间另一台人为设计的属性。
定义新的RGB空间
CIE xy颜色空间通常用来作为一台标准,从这个标准里衍生其他颜色空间,这里以sRGB空间为例,定义其三个color primaries(原色)对应xy空间的坐标:
由于xy只告诉我们色调,而不知道强度。将xy值对转化到XYZ空间中就是一台方向向量,而这些向量的相对长度我们并不知道,所以只定义三个原色的xy值还不能让这个新的颜色空间被使用。
因此这里定义第四个数据white point(白点)。如果我们把三个原色对应在XYZ空间的向量加起来,我们可以得到空间中的某一台位置:
接着缩放这3个向量的相对长度(不改变方向),使得结果处于白点的位置上(下图白色的点):
这样我们就知道3个向量的相对长度了,即白点定义了3原色的相对强度。
3原色向量的相对长度确定后,以此为基,形成一台新的3D空间,其中让白点处于(1,1,1)位置上,白点的亮度为1,新的原色空间就完成了:
总结,从XYZ空间中定义一台原色空间(以sRGB空间为例),需要:
- 定义原色的xy坐标和white point。
- 确定原色之间的相对强度(即在XYZ空间中向量的相对长度)。
数学求解过程:
已知3个原色,和白点的xy坐标,首先将它们转化为XYZ/xyz空间下的向量:
$$
有了基向量,由此可定义一台RGB到xyz的转换矩阵M_{RGBtoxyz}:
$$
不过这个矩阵还不能使用,因为我们还需要确定原色向量的相对大小,定义缩放比例S_R,S_G,S_B,根据前面的讨论,缩放后的原色向量相加会得到白点W_{xyz}:
$$
还要对白点的亮度值y进行归一化,确保(1,1,1)是白点:
$$
最后带入数据求解缩放比例。
将缩放比例乘到原来的RGB基向量上, 新的向量就是定义新的RGB空间的基了:
并且,两个颜色空间A和B之间的转换,也可以将AtoXYZ 和 XYZtoB的矩阵结合一下。
同时由于XYZ空间的Y表示亮度,因此RGBtoXYZ矩阵的第二行就表示RGB颜色的亮度,以前面求出来的sRGB到XYZ空间的转化矩阵结果为例:
Color Temperature(色温)
色温的概念来自于黑体辐射,不同温度下黑体会辐射出不同光谱的光,在xy色度图中画出的线叫Planckian locus(普朗克轨迹):
自然光(如太阳)和黑体辐射很相似,因此色温就用于表示自然光的颜色。
有的颜色空间也用色温来定义其white point,比如D65 ,就是指6500 开尔文对应的颜色。
Scene Referred Color Space(场景参考空间)
真实世界动态范围
通常LCD显示器只有250nits(cd/m^2),日光灯大约1.2万nits,太阳大约16亿nits。
当我们在具有于这些真实世界成比例的空间中工作时,它被称为“Scene Referred” color space(场景参考空间)。
真实世界的动态范围很大,但是传统SDR显示器却无法表达这么大的动态范围,因此需要Tonemapping将一台HDR scene referred图像处理成可显示图像。
Visual Perception Limition(视觉感知的局限性)
我们的眼睛感知世界很强大,但它确不是一台很好的测量设备。
比如说下图左的亮度其实比右图高,但其实右边的感知亮度更高一些:
以及下图的CrAIk-O'brien-Cornsweet Illusion,你觉得立方体的上面比下面暗,实际上它们的颜色是一样的:
感知颜色色调的判断也和周围的环境有关,比如下图中的花看着是红的其实取色是灰色:
以及还有一种叫change blindness(变化盲视)的现象。
因此不能单纯只依靠人眼,利用测量设备做研究比较重要的手段,如:
- Camera on tripod(三脚架上的摄像机)
- Spectrometer(光谱仪)
- Light meter(光度计)
- Calibration equipment(校准设备)
SDR (标准动态范围)
传统SDR 管线
传统SDR管线,在得到Scene referred空间的图像后,经过Exposure(曝光) 和Tonemapping变成可以被显示器显示的动态范围。
Tonemapping之后,应用sRGB Transfer Function,即OETF (optical-electro transfer function)将光信号转化为电信号,此时处于Display referred空间。
显示器将做一台TOEF(elector-optical transfer function),即OETF的逆运算将电信号转化为光信号。
剩下的操作在sRGB gamma空间完成:
SDR 标准, Rec.709和sRGB
SDR的标准有很多,比如:
ITU-R Recommendation BT.709,通常也叫做BT.709或Rec.709。
我们感兴趣的SDR标准主要就是Rec.709和sRGB。
Rec709和sRGB的一些细节:
Rec.709和sRGB拥有相同的三原色xy坐标和白点。因此处理SDR的情况很少需要进行色域转换。
SDR的Transfer Function3是"gamma4",即一台指数运算。
gamma曲线可以让我们指定更多的感知线性值:
这么做的好处有很多,比如如果信号的bits数有限,那么使用gamma操作会使信号被量化之后有更少的banding。
我们在PC上使用的transfer function是sRGB。
在TV上使用,有时会用另一台transfer function是Rec.709。
其使用的gamma值不同:
sRGB和Rec.709的区别,Rec.709的暗部比sRGB拥有更多的细节。
为啥PC和TV用不同的transfer function呢?
sRGB用在PC上,在一台光线良好的室内办公环境中。
Rec.709在TV上,在一台光线比较昏暗的家庭影音环境中。
所以实际上不同的gamma只是针对不同环境的一种建议。
显示器使用的EOTF是指什么?
事实上并不是上面使用的transfer function的反函数。目前的答案是BT.1886,大约gamma2.4。
也就是说我们将颜色以sRGB的形式传递给SDR显示设备,实际上它们是用BT.1886来显示。
Rec.709的RGB Limited Range
- RGB Limited Range也是Rec.709标准的一部分。
- 作为显示器时,输入有效范围为[0, 255]。
- 作为TV时,输入信号会故意缩放和偏移到有效范围为[16, 235]。
- 通常有效范围的问题不需要我们关心,设备自动处理。但一些特殊情况需要知道,比如对比HDR和SDR效果时,对SDR内容的截图要检查RGB Limited Rangei是否开启,而且要考虑用户是否进行了错误的设置。
- 对于一台SDR显示器来说,我们输出给显示器的值都是相对值,即[0,1],0表示显示器最暗的亮度,1表示TV的最高亮度,但TV的最高亮度我们并不知道。
SDR的局限
- 我们不知道显示器的最高亮度,我们给显示器的输入只是一台0-1的值。
- 有充足的理由让照片看起来更明亮一点,给人场景明亮的印象。而如果单纯把图片亮度提高,相当于我们只是在调高SDR TV的峰值亮度。而我们可能更希望用一台不同的Tonemapping曲线,让亮部有更多的细节效果更好。TV虽然有一些类似的设置,但远远不够。
注:这里我理解的是你缩放TV的最大亮度,但是对原始的图片亮度分布并没有改变,而随着输出亮度的变化我们可能是希望原始的亮度分布有变化,比如用不同的Tonemap曲线。
- SDR的gamma transfer functions让感知亮度趋于线性,但随着亮度的增加这个不太准确了,亮度增加的情况下我们的亮度感知更像一台log曲线。
- SDR只提供了有限的颜色空间,sRGB空间本身只是了完整色度图内的一台子集。
HDR(高动态范围)
HDR标准
HDR标准有很多,以下几个代表:
- scRGB:在PC上,Microsoft的HDR标准。使用和sRGB相同的原色,但允许数值为负或大于1来进行色域的扩充(数据浪费很多的样子)。
- HDR10系列。
- Rec.2020/BT.2020定义了新的原色坐标和白点,比sRGB大很多,是一台广色域。
- BT.2100扩展了BT.2020,加入了HDR的transfer function。其中有ST 2084 使用的 PQ transfer function,和STD-B67使用的HLG tranfer function7。
PQ Transfer Function
PQ Transfer Function 的思想是根据人类视觉系统的感知对比度来量化我们的信号,下面是一台叫Barten Ramp的图,横坐标表示亮度,纵坐标表示对比度。
黑色虚线表示人眼视觉系统的感知对比度。量化的信号若低于黑色虚线则表示对比度足够,高于黑色虚线则表示对比度不足,会造成Banding效果。
可以看到我们之前在SDR中提到使用的Gamma Transfer Function,当使用10bits Gamma时,信号量化后的对比度是不够的。而使用15bits Gamma时在亮度较低时足够,但在亮度很高的地方造成了非常大的浪费:
所以,像ST 2084 使用的12bis PQ transfer function,则基本上贴着人眼感知对比度的黑色虚线走,对比度足够又不产生太多浪费:
PQ Transfer Function的一些特点:
- 不同于SDR的Transfer Function横纵坐标是相对亮度。PQ 曲线则是绝对的亮度,取值[0,1]表示[0,10000]nits(10000nits大约为荧光灯管亮度的极限):
比如说0.5 PQ函数值大约为92.246nits(100nits大约为老的LCD面板的极限),0.75PQ函数值大约为983.378nits(1000nits大约为HDR TVs的极限):
- PQ曲线是可逆的,转换非常简单。
- 计算比gamma transfer function复杂:
float LinearToPQ( float linearValue )
{
float L = linearValue / 10000.0f;
float Lm1 = pow( L, PQ_M1 );
float X = ( PQ_C1 + PQ_C2 * Lm1 ) / ( 1 + PQ_C3 * Lm1 );
float pqValue = pow( X, PQ_M2 );
return pqValue;
}
- PQ定义的亮度可以到10000nits,但目前的TV只约2000nits,也就是我们仍然对scene referred做tonemapping。
- 目前HDR显示器通常只能到2000nits,无法输出10000nits,因此显示器也会再运用一台display mapping,映射到其显示范围。
Academy Color Encoding System(ACES)
ACES定义的是一套标准,曾经在影片和动画行业使用。github有实现的reference。
ACES管线有多个步骤,用于解决特定的问题:
流程:
- Camera Data,摄像机数据(可以在不同的颜色空间)。
- Input Device Transform(IDT),将输入数据转换到一台相同的颜色空间。
- Color Grading,校色,注意和之前的SDR不同这里校色发生在Scene Referred,且是在一台广色域下进行的。
- Look Modification Transform(LMT),主要指ColorGrading等。
- Reference Rendering Transform(RRT),动态范围映射,比如Film tonemap curve。
- Output Device Transform(ODT),即OETF和EOTF。
对游戏来说,其中一些步骤是需要变化的:
- 不需要Input Device Transform(IDT),因为游戏能保证所有资产都在一台颜色空间,比如sRGB。
- ODT是固定的,即设备虽然有不同,但都以相同的强度进行转换,例如相同的Tonemap。而我们想要这一步可以让玩家配置。
- 在HDR进行校色不错,解决了不少问题。
COD:WW2的HDR管线实现
下面主要说的是COD:WW2中具体去实现的HDR管线,实现的结果要满足一下目标:
- 在HDR和SDR上要保持一定的画面一致性。
- SDR管线的结果要和旧的SDR管线表现差不多(兼容性)。
- 高质量和高性能。
- 对美术团队的干扰最小。
上面是旧管线,下面是新管线,一些步骤的变化如下:
- 一些步骤放到Linear HDR上进行。
- Color Grading也在HDR上计算而不是SDR,这样保证了新的SDR/HDR的一致性。
- Tonemapping包括Tone Curve(ACES里的RRT)和Display Mapping(ACES里的ODT)两个步骤。
在Linear HDR这一块流程的细节:
- 在Exposure之后进行色域扩充,从sRGB扩充到BT.2020,在广色域下进行Color Grading。
- 接着使用一台非常类似ACES RRT提供的Tone 曲线,将scene referred的动态范围映射到PQ的0-10000nits范围。
经过Tonemap之后,理论上如果我们有一台完美适配PQ的显示器,即最大输出10000nits,那么之后只需要再进行色域转换和OETF就可以了。
但由于目前HDR显示器还没有这么强的能力,我们目前或是需要一台亮度的映射,将0-10000nits亮度映射到显示器可以显示的范围内。
Display Mappping to HDR TV
步骤:
- 降低0-10000nits的信号动态范围到HDR显示器的显示范围内。
- PQ transfer function的OTEF。
对于第一步的降低HDR范围,这里使用BT.2390 transfer function,它是一台TVs上的标准,用于将HDR的输入映射到显示器的显示范围内。
横坐标就是原始信号的亮度范围,纵坐标是映射后的亮度范围,单位都是nits。
可以看到这个曲线是比较简单的,基本上需要提供的就是一台新的最大值WhitePoint和最小值BlackPoint。
此操作在l Ct Cp颜色空间进行。lCtCp空间的特点是可以提供色调坐标,和感知线性的亮度数值。
BT.2390 transfer function应用对象是LCtCp空间下的亮度数值,这样就确保色调不会发生偏移。
新的WhitePoint和BlackPoint由用户来自定义:
除此之外还额外提供了一台“gamma"参数5给用户调节亮度:
Display Mapping to SDR TV
步骤:
- 降低HDR动态范围。
- 色域从BT.2020转换回BT.709/Rec.709。
- 三是使用BT1886 transfer function(大约1/2.4 的指数运算)的OETF。
注:关于SDR的OETF在前面的SDR标准中有讨论。
其中第一步的降低HDR动态范围,使用的是一台线性函数和exp衰减函数组合的固定曲线:
对RGB三个通道分别应用这个曲线会造成色调的偏移,这里也将曲线应用在亮度上这样不会有色调偏移,然后用一台参数控制在有色调偏移和没有色调偏移的结果之间插值。
不同于HDR,SDR用户可自定义的只有BlackPoint。
Temporal AA
Display Mapping之后应用Filmic temporal AA,让AA在感知线性的空间中进行。
UI Rendering
渲染UI有多种方式。比如渲染到一台离线的Buffer,再合并到Color Buffer中:
- 需要为离线Buffer分配较多的bits才可以有不错的效果(为啥?)
- 需要多一台Pass合并到BackBuffer
CODWW2选择的直接渲染到Color Buffer中:
- 更加复杂一点,以及如果要处理多种Blend Mode会有较低的性能(为啥?)
- 需要把UI(一般是sRGB)转换到PQ,如果层数很多的话这个转化也是比较费的。
对于该方法进一步来说:
在旧的SDR管线中,UI混合在sRGB空间进行,因此对于新的SDR管线也是一样的。
对于新的HDR管线,为了保持得到和SDR管线一样的结果,这里的方法是UI的shader会先缩放到300bits,然后进行一台色域的转换到BT2020和PQ后再进行混合。
这样做无法完全保证HDR和SDR的一致性,但效果已经比较接近了。还有一台问题是如果UI使用其他的Blend mode则需要不一样的处理方法,好在这里CODWW2的UI只用了普通的blend mode,没有其他模式。
注:我个人理解它这里算是针对UI的一台Hack,在不使用其他Blend Mode的情况下,这个Hack做法能保持UI和SDR的表现差不多。
Exposure Adjustment
略过,这里有比较多的兼容旧管线的内容。
Universal CLUT
为了降低计算消耗,将HDR ColorGrading、Color Blindness Accessibility Filter(色盲调节)、Tone Curve和DisplayMapping的计算结果烘到一张LUT中,叫Universal LUT(CLUT)。
- CLUT是一张3D Texture,大小为32x32x32。
- 采样CLUT的输入是Exposure步骤输出的BT.2020空间Linear HDR数值,并且采样之前要经过Log2 Shaper函数编码。
- Log2 Shaper将输0-1024范围映射到0-1范围。
- CLUT 的格式和最终的display buffer的格式相同,通常是UNORM_10_10_10_2。
- 相关参数改变时,重新生成CLUT。
HDR Color Grading
HDR的ColorGrading发生在曝光之后,在HDR颜色下进行的。
不同于在游戏引擎中去实现ColorGrading的参数调节,作者是用外部的调色软件去做ColorGrading,然后将结果保存为LUT再放到游戏中使用。外部调色软件有:
- Fusion (Blackmagic Design)。
- DaVinci Resolve (Blackmagic Design)。
- Nuke (The Foundry)。
这里作者使用的是Fusion,该软件的界面布局如下:
左上的预览窗口,左边是原始图像,右边是调节后的图像。
左下方是使用的调色结点,右侧是操作调色结点的参数面板。
流程:
- 将游戏中曝光步骤之后的HDR场景输出为fp.16格式的图片。
- 软件中加载该图片,美术在软件中进行校色。
- 导出校色结果对应的LUT回游戏引擎中结合生成CLUT使用。
因为导出的是HDR图片,为了在SDR显示器上使用软件调色时观看原图不至于过曝,这里还利用了软件中“ViewLUT”的功能,即从游戏引擎中导出针对当前观察设备的Tonemap和DisplayMapping步骤的LUT出来,然后作为软件中ViewLUT的参数去使用,这样就可以调色软件中看到一台和游戏引擎内观察到的一样的结果。
作者还写了个工具支持了实时预览,即美术在软件中调好色之后,自动导出的LUT到磁盘中,游戏引擎用一台脚本周期性地读取该导出的LUT文件并加载到游戏中使用。
注解和参考资料
[1] A Beginners guide to colorimetry :https://medium.com/hipster-color-science/a-beginners-guide-to-colorimetry-401f1830b65a
[2] 负数的存在其实就意味着,对于该测试的颜色,并不可以用3种单色光完美的匹配。但对于研究人员量化无法匹配的光谱范围是有帮助的1。
[3] Transfer Function的存在本质上是为了让信号量化后的对比度在一台合理的范围内,如果此对比度小于眼可以分辨的对比度,那么就会形成Banding。如果远超过人眼的分辨能力,又会造成存储和带宽的浪费。
[4] gamma这个词最早是因为要处理CRT的显示特点而诞生的,但目前的显示设备已经不是CRT了,它现代的意义是作为SDR的Transfer Function,可以提高信号在暗部的存储精度,减少颜色的banding,之所以有效是因为人眼对暗部的感知对比度比亮部要高6。不过随着亮度的提高Gamma作为Transfer Function是有局限性的,这个在后面会提到。
[5] 这个参数很多3A游戏中都有,一台额外的gamma参数,主要是让用户根据其所在的观察环境修改动态范围的分布8。
[6] Unravel | Understanding Gamma:https://www.unravel.com.au/understanding-gamma
[7] HLG,全称Hybrid Log Gamma,是一种混合方法,在亮度较低时使用gamma,亮度较高时使用log,特点是有比较好的兼容性,在同时需要显示SDR和HDR内容的情况下被广泛使用6。
[8] Image dynamic ranges : https://bartwronski.com/2016/09/01/dynamic-range-and-evs/ |