谷歌3D模型工程师分享:关于glTF的色彩精度
为大家提供建立流程和设定期望所需的背景
(映维网Nweon 2022年09月27日)交互式3D模型是继图像和视频之后的下一种媒体类型,所以,行业越来越多地使用< model-viewer> 和其他渲染器在商业环境、博物馆和其他地方来显示相关的3D模型。用户对确保所呈现的像素准确表示模型所基于的真实对象感兴趣。因此,需要一个质量保证过程来确保3D模型本身已被准确设计,并且模型的呈现逼真。
日前,主要在谷歌负责< model-viewer>的资深软件工程师埃米特·拉里什(Emmett Lalish)撰文介绍了关于glTF的色彩精度,从而为大家提供建立流程和设定期望所需的背景:
Khronos的glTF是第一种指定基物渲染(Physically-Based Rendering/PBR/基于物理的渲染)的3D模型格式,这意味着它包含以真实世界单位定义光在物理方面应如何反射和折射的材质属性。这意味着渲染器可以在GPU着色器中自由创新,以创建基础物理的越来越精确的近似,因为glTF没有指定任何单一近似。
这同时意味着,尽管不同的渲染器可能会在精度和速度之间进行不同的权衡,但你可以确信,即便在不相关的codebases中,glTF看起来都会一致(尽管不是像素相同)。我们将glTF称为3D的JPEG,因为它经过压缩以实现高效的web交付,并且可以由大量viewer一致呈现。
乍一看,不同的glTF查看器可能不一致,但这通常不是由于渲染差异,而是由于默认场景设置。基于物理的渲染意味着场景将环境光作为输入,就像真实相机一样。因此,类似于获得一致的照片,我们不仅需要相同的对象,并且需要相同的照明和camera设置。Viewer的默认设置没有标准,因此有意识地将其设置为一致的值非常重要。这正是我们所做的事情,以显示glTF渲染收敛于各种流行渲染器的状态。
1. 什么是色彩精度?
PBR的目标是在用户与3D模型交互时以帧速率创建彩色精确图像。当然,渲染器只能与输入的3D模型一样精确,因此确定3D模型是否实际上准确表示其所基于的真实世界对象的过程同样至关重要。
最正确的方法是设置真实对象的照片拍摄,在其全动态范围内捕捉其周围的环境照明,记录camera设置和位置,然后设置相同的渲染场景并比较输出图像。遗憾的是,成本往往过于昂贵。
即使在这种理想的比较场景中,你都会遇到一个非常重要的问题:人们使用什么指标来比较图像?像峰值信噪比这样的简单像素比较指标往往会给不明显的差异赋予太多权重。所以,感知指标更好,但更随意,更难定义。
由于大多产品都是使用RGB材质规格设计,因此通常的想法是在glTF的基色中简单地反映这一点。如果RGB值位于适当的色彩空间中,这是一种非常好的色彩精确建模方法。glTF规范表示,baseColor因子(在0和1之间归一化)正是材质反射的光的给定通道(波长)的分数。baseColor纹理相同,但先通过sRGB传递函数提取线性值。不应假设给定的绘制样例RGB值以相同的方式定义。
在验证渲染的色彩准确性时,第一个想法通常是检查输出渲染图像是否与glTF baseColor(或预期的绘制样例RGB)具有相同的RGB像素值。这是一个根本错误的期望,因为它否定了基物渲染的目的。下面的细节和示例支持这一断言,并为更有用的验证方案指明了方向。
2. 渲染色彩与baseColor匹配有什么问题?
关于PBR,需要明确的最重要的一点是,它准确地表示入射光和材质特性之间的相互作用,其中除了baseColor之外,金属度和粗糙度同样非常重要。然而,给定像素的渲染输出仅为RGB,这意味着如果它与baseColor RGB匹配,则根据定义,入射光和其他材质属性不会以任何方式影响生成的图像。
我们从一个简单的例子开始:六个具有均匀材料的球体。顶行为白色(baseColor RGB:[1,1,1]),底行为黄色(baseColor RGB:[1,1,0])。从左到右依次为闪亮金属(金属度:1,粗糙度:0)、闪亮塑料(金属度:0,粗糙度:0)和哑光塑料(金属度:0,粗糙度:1)。最左边的大约可以认为是抛光的银和金。
具有不同均匀材料的球体的基本示例
请注意,具有相同baseColor的不同材质渲染方式不同。哪些像素与baseColor RGB匹配?事实上,如果你真的希望渲染像素与基色RGB值匹配,glTF有一个专门的扩展:KHR_materials_unlit。这个扩展不基于物理,因此适用于标签和3D扫描等仅生成RGB纹理的情况,其中所有应用的照明都作为捕获过程的一部分烘焙。这是上面模型在unlit扩展时的外观:
使用glTF Unlit扩展的球体与上面相同
显然,照明在提高三维模型逼真度方面十分重要。下一个常见的想法是选择一个很好的均匀中性照明场景,使输出RGB值“接近”预期的baseColor。嗯,很容易产生一个均匀的照明环境,但对于PBR来说,结果可能会令人惊讶:
具有均匀照明的基物渲染
看起来白色球体已经消失,但它们依然存在。倾斜视图,你可以看到它们遮挡了黄色球体。事实上,它们只是完美地伪装起来。所述场景称为Furnace Test,并主要用于检查渲染器的能量守恒。物理学可以证明,在完全均匀的光照下,白色球体应该均匀地反射与从环境中入射的光完全相同的光,因此与之无法区分。
请注意,黄色球体的结果实际上与unlit结果非常接近。在有光泽和无光泽,或金属和塑料之间几乎没有明显的区别。这实际上是准确的;如果你真的找到了一个照明完全均匀的地方,你同样无法区分所述材质之间的差异(假设你可以隐藏自己的反射,因为你是照明环境的一部分)。看起来如此不真实的原因是:几乎不可能找到这样的环境。真实的环境有纹理,而我们是用纹理的反射来理解反光。
接下来,让我们回到原始版本,它使用了< model viewer>的“neutral中性”环境图像。这个环境如何设计的详细信息请访问这里和这里这里。照明旨在均匀(从各个侧面),但不统一,从而提供足够的纹理来区分材质类型。
它是纯灰度的,因此不会改变材质的色调。这与室内照明可能会偏黄、室外照明可能会偏蓝或日落可能会偏红相反。PBR将忠实地产生camera在场景中捕捉到的色彩,当然,色彩在中性照明下看起来与同一物体不同。
回到原始示例,但使用了曝光滑块
请注意,我们可以将右上角的球称之为纸白色:一个完美的哑光反射器。然而,尽管有白色baseColor(sRGB:[255,255,255]),但请注意,渲染色彩从[177,177,177]到[237,237,237]不等,从未达到纯白色。为什么会这样?中上部的球确实从其闪亮的表面反射出一定的纯白色。镜面反射是对漫反射的补充(漫反射是从哑光表面获得),因此如果漫反射已经饱和了我们的像素,那么就不可能区分光泽物体和哑光物体。尝试增加曝光滑块以查看效果,这在摄影中被称为过度曝光。
你可能会注意到,曝光似乎比黑和白对中间值的影响更大(尽管曝光是线性光倍增)。你是对的,这是由渲染管道中最后发生的非线性色调映射步骤引起。色调映射本身是一个复杂的主题,但它对理解PBR至关重要。在开始之前,我们先比较一下渲染和摄影管道。
3. 渲染与摄影相比如何?
3D渲染(尤其是PBR)旨在模拟摄影,而摄影反过来又旨在模拟人眼和大脑。大脑部分必不可少,因为真实照片的目标是通过查看它来唤起与查看原始场景相同的感知。这非常困难,因为打印照片反射的光或显示器发出的光的强度明显低于真实世界,对比度也较低。即使是HDR显示器的对比度都比眼睛在正常室外看到的要低几个数量级。
谢天谢地,我们的大脑对我们的感知进行了大量的调整,包括校正对比度。这允许我们能够以非常压缩的动态范围打印照片,同时依然能提供真实日落的感觉。这种动态范围的压缩我们称之为色调映射。在摄影中,你可以将其视为从相机的原始图像到最终图像的转换。在具有曝光叠加的现代摄影中,它变得更加重要,在这种摄影中,可以产生比传感器在单次拍摄中所能产生的更高动态范围的原始图像。
摄影和3D渲染管道的比较
在3D渲染中,没有传感器,计算是在浮点中完成,这意味着原始图像是有效的全HDR,其范围甚至比曝光堆叠通常可能的范围更大。查看所述原始图像的直方图时,通常会显示一条很长的尾巴,其代表比场景其余部分更强烈的小而闪亮的闪烁。为了在压缩到SDR的同时保持感知,使用非线性色调映射曲线。
4. 色调映射的工作原理?
色调映射是一个通用术语,基本上可以指任何色彩转换函数。即使摄影师在后期处理中可能应用的单独操作,例如伽马校正、饱和度、对比度等,其都可以组合成一个单一的结果函数。我们在这里称之为色调映射。然而,我们只对色调中性函数感兴趣,这是我们将在这里讨论的唯一类型的色调映射函数。因此,重点将主要放在亮度上。
< model viewer>使用的色调映射功能是ACES,它是电影行业开发的标准,广泛用于3D渲染。与大多数色调映射曲线一样,它在对比度范围的中心焦点处是相当线性的,然后逐渐向外,将亮和暗的长尾巴平滑地压缩到所需的零到一输出范围。其思想是,与场景的大部分相比,人类感知的过亮和过暗区域之间的差异较小。然而,由于为额外明亮的高光保留了一定的输出范围,因此表示亚光baseColor输入范围的剩余范围同样有所减少。这就是为什么纸白色球体不会产生白色像素。
有时,在处理哑光对象并尝试将输出色彩与baseColor进行比较时,你会注意到这种色调映射压缩,并将其识别为明显色调差异的来源。通常马上想到的办法是,通过不应用色调映射来解决这个问题。
但问题是“无色调映射”并不存在,因为不知何故,unbounded输入范围必须转换为编码器期望的zero-to-one范围。如果不执行这个步骤,编码器将简单地钳制这些值,相当于一个具有尖角的分段线性色调映射函数,并会为有光泽的对象引入感知错误,如下面的示例所示。
请注意,即使不增加曝光,你都无法区分闪亮和哑光白色塑料球。由于哑光白色球体的一半现在渲染为纯白色,因此没有足够的净空来容纳闪亮的高光。同样,由于通过钳制值移除了着色,所以球体的上半部分将失去其3D外观。勾选复选框以返回ACES色调映射,从而进行快速比较。切记,在切换后再回头看。人类感知的另一个技巧是它对锚定的依赖程度。从饱和黄色切换后,黄色看起来会立即褪色,但环顾四周后,这种感觉会消失。
这个例子同时突出了良好色调映射函数的第二个关键元素:去饱和过度曝光的色彩。查看金色球体(左下角),并与应用ACES色调映射的上一版本进行比较。金属的baseColor与入射光相乘,因此金色球体上的白光会产生黄色反射(完全饱和的黄色,在这种情况下是完全饱和的baseColor)。使用钳制色调映射时,高光确实是饱和的黄色,但这在视觉上看起来并不正确,即使你可以证明它在物理上是正确的。
好的色调映射曲线(如ACE)不仅会压缩亮度,而且会将色彩推向越亮的白色。这就是为什么金色球体的高光会变成白色而不是黄色。这遵循了相机传感器和我们眼睛在对过度曝光的彩色光做出反应时的行为。你只需观察蜡烛的火焰或火花就能看到这种效果,其中最亮的部分尽管色彩不同,但看起来都是白色的。对于感兴趣的读者,英伟达在这里提供了更多关于色调映射和HDR的详细信息。
避免色调映射的最后一种方法是选择曝光,令所有像素都在[0,1]范围内,从而避免值钳制。对于具有低动态范围照明的哑光对象,这可以提供半体面的结果,但对于有光泽的对象,它会完全崩溃,如以下屏幕截图所示。
上述球体的图像没有色调映射和曝光设置
问题是,镜面反射高光比场景的大多数场景亮几个数量级,因此要将其适应输出范围,需要将曝光降低50倍以上。这会降低大多数场景的亮度和对比度,因为只有几个小高光。这种中性环境没有很高的动态范围;如果要使用包含太阳的室外环境,则曝光必须非常低,以至于几乎整个渲染都是黑色的。
这里显示的所有内容都呈现为8位sRGB输出,但HDR显示和格式越来越常见。我们可以通过将原始图像的HDR保持在HDR输出格式来避免色调映射吗?简而言之,答案是否定的。
因为与传统的SDR相比,HDR显示可能具有较高的动态范围,但它们依然比我们眼睛在现实世界中的体验少几个数量级,因此色调映射的所有相同原因仍然适用。但需要注意的是,色调映射函数的选择应取决于输出格式。理想情况下,它甚至取决于显示器的对比度、亮度设置和周围的环境照明水平,但所述数据不太可能可用。
5. 我们如何验证glTF 3D渲染?
希望前面的讨论已经使你确信,简单地根据对象的“正确”色彩验证某些渲染像素的色彩不是一个有用或有效的过程。要是这么简单就好了。相反,你需要审视你的整个渠道,思考你的最终目标到底是什么。
为了可测量性,我们假设最终目标是最小化在线购物的退货率,其中购物者的主要视觉线索是一个3D模型(假设我们正在进行足够好的渲染,不会影响购买率)。
为了成功,我们必须渲染购物者感知到的图像,使其与实际产品到达时的感知等效。这与杂志或网站的照片目标完全相同。
产品摄影的历史要长得多,所以我们从这里开始。产品摄影师的管道是什么样子的?很明显,它们各不相同,但总体步骤往往是:1)照明设置;2)相机设置;3)拍照;4)后处理。理想情况下,可以捕捉照明环境,将相机设置转换为矩阵和曝光,使用相同的后处理,根据测量的材质属性编写glTF,并输出与照片非常匹配的渲染(尤其是使用路径跟踪渲染器)。
人们很容易将观察到的任何差异归咎于渲染器,尤其是实时光栅化器,但事实上,许多研究都致力于使它们在物理上具有惊人的准确性和一致性,正如你在保真度比较中所看到的那样。几乎总是最严重的错误是照明、材质、曝光和后处理方面的差异。
我们考虑一下在摄影后处理步骤中会发生什么。有些东西不适用于渲染,例如遮挡阴影使其半透明,3D渲染器可以自动做到这一点。除了色彩中性色调映射之外,有时还会故意“校正”色彩。为什么?毕竟,如果实际场景中测得的光不正确,那是什么?
可能有些后处理色彩校正只是权宜之计。在数码摄影之前,为了获得正确的外观,你必须调整灯光和场景,这需要体力劳动。数字后处理可以降低照明精度。但在3D渲染中,照明同样是数字,因此通常更好的做法是保持后处理步骤简单(例如仅ACES色调映射),并在必要时调整环境图像。由于3D渲染完全自动实时进行,因此无法对每个帧进行手动定制色彩调整。
6. 感知扮演什么角色?
与摄影一样,目标是观众对图像的感知。没有任何数学指标能够代表人类的感知以及对真实人类的感知。孤立像素度量是有问题的,因为人类的大部分感知受到对象的背景和环境的影响。这是因为我们的大脑正在有效地试图消除光线的影响,使我们能够始终如一地感知潜在的材料特性。我们的大脑根据背景估计要去除哪些照明。
当使用相机图像作为背景在AR中渲染产品时,为了获得最一致的产品感知,其实际渲染像素需要更改色彩,理想情况下需要根据实际的局部照明环境进行更改。这有助于确保当我们的大脑对光线进行“校正”时,我们的感知能返回真实物体的属性。理想情况下,渲染管道中应采取应用于相机原始图像的相同色调映射和白平衡。遗憾的是,访问所述数据可能十分困难。
当然,人类的感知并不一致,这使得所有这一切更加困难。一个很好的例子是这个连衣裙照片,它实际上是在黄色灯光下过度曝光的照片中的一件蓝色和黑色连衣裙。尽管像素色彩大致为紫色和棕色,但超过一半的人认为裙子是蓝色和黑色的,另有30%的人认为它是白色和金色的。显然,这种模糊图像在商业环境中是不可取的,但它有助于了解感知色彩与像素色彩的差异。
7. 我们如何验证glTF模型?
一般来说,3D渲染的部分目的是通过使整个过程数字化来避免摄影成本。对于美术来说,3D模型的制作成本很高,但它可以快速创建许多不同的照片和交互体验。那么,如何验证该三维模型对物理产品的准确性呢?当然,可以测量尺寸和形状(glTF始终以米为单位,所以请检查你的单位),但我们将重点关注材质特性,如baseColor和粗糙度。
选择材质特性的最准确方法是测量它们,因为所有glTF材质都是用物理术语定义。然而,这种测量很难进行。市场上有一些产品可以扫描插入的样本,并将相关特性与之匹配。现代的三维扫描算法可以恢复材质属性,但机器学习系统并不完善,很难进行基准测试。在技术进一步发展之前,我们可能无法获得正确测量的材质特性。
创建材质最常见的工作流程是3D美术手动调整属性,直到渲染看起来正确为止。理想情况下,美术将物理对象放在桌上,并与渲染进行比较,从而专注于感知而不是像素值。但最重要的是,他们的创作软件设置为以与对象呈现给用户相同的方式呈现。
这是因为当渲染看起来不正确时,可能是材质或照明需要更改。如果对材质进行测量,人们可以安全地集中精力改变照明,但如果不这样做,提前选择一个固定的照明环境来消除这个变量将非常有帮助。同样重要的是,使用的色调映射函数需要一致。
理想情况下,美术应在各种照明环境下检查模型的渲染。特定类型的照明往往会隐藏或暴露某些材质属性错误。至少,最好在中性室内环境和阳光明媚的室外环境中进行测试。太阳将产生非常高的动态范围,以及彩色照明,这将有助于检测各种可能的材质问题。这种场景往往会包含各种各样的真实照明情况,并可能会应用于虚拟照片拍摄或AR中。
最后,常见的警告适用于色彩空间和显示器之间的差异。glTF格式指定在内部使用sRGB色彩空间,这是最常见的输出格式,但随着HDR显示变得越来越常见,这很可能很快变得更加复杂。
8. 我们可以得出什么结论?
遗憾的是,没有简单的答案,因为色彩和感知是复杂的,甚至比基于物理的渲染更复杂。希望这个背景介绍能够为你的创作和验证过程提供一个框架。关于PBR,需要记住的最重要一点是,渲染色彩与材质baseColor相比会有所不同,这使得下面的演示非常逼真。
请注意,产品的色彩在每个环境中有多大的不同,但这正是使其看起来逼真的原因