图形学系列文章:全局光照的上层理解

文摘   科技   2024-10-18 15:32   山东  

2024年 第20篇


建模时模型在不同环境有着不同的颜色怎么办?


  • 什么是工作流

  • 什么是 Linear,什么是 sRGB

  • 为什么要工作流转换,怎么转换



01 背景



在处理模型的时候,我们发现很多模型在建模的时候并没有开启 Gamma 矫正功能,这导致模型在不同环境有着不同的颜色,比如在 3dsMax 环境中模型是它该有的颜色,而当我们导出模型到其他格式如 FBX、glTF 时并在诸如 Unity、UE、浏览器 WebGL 等环境中查看时,颜色会变得更亮。

接下来我们举一个例子,下方是一个“未开启 Gamma 矫正”环境下,颜色为 rgb(0.5,0.5,0.5)的茶壶,它在 3dsMax 环境下的颜色是这样的:

3dsMax 非gamma环境

现在,我们把它导出到 gltf,可以确定 gltf 中的颜色也是 rgb(0.5,0.5,0.5),没有变化。

现在,我们把它导入到一些 gamma 环境的渲染器中来查看(也就是其他非 3dsmax 环境):

Babylon.js

Three.js

Unity


虽然会有一些环境光照的影响,但可以明显看出,这些渲染结果肯定都不是我们在 3dsMax 里调出来的“黑灰色”。所以为什么会有这种结果呢?在这里可以先给出结论:我们没有正确完成 Linear 工作流到 sRGB 工作流的转换。


02 什么是工作流



工作流是指我们处理美术资源(如贴图、模型)的工作过程,工作流不是死的,不同的公司不同团队都可以有自己的工作流,只要最终能实现预期的视觉效果即可。而我们知道美术资源的处理过程包含很多方面的工作,比如:建模、调色、渲染、性能优化等等,而这里的 Linear 和 sRGB 工作流就是其中的调色这一方面的工作过程。

所以,既然要调色,我们肯定要对颜色有充分的认知,这包含:物理世界的颜色、人眼所能看到的颜色、显示器所显示的颜色三个方面。只有对颜色有了充分的认知,我们才能设计出——能在显示器中显示出——我们期望的人眼能看到的——真实物理世界的颜色。


03 什么是 Linear,什么是 sRGB



我们之所以要在计算机里建模,实际上就是想让人眼能看到“类似物理世界的物体”,计算中的模型和物理世界的物体,对我们来说是等价的。因此,我们会直接从物理世界的物体的角度出发,来解释这个问题。

要在计算机里表达物理世界的颜色,必须要抽象,因此我们抽象了 RGB 模型,使用三个通道的混合来表达物理世界的颜色。这三个通道在计算机中的数值介于 0~1 之间,其中 rgb(1,1,1)表示白色,rgb(0,0,0)表示黑色。因此,物理世界的颜色实际上变成了 RGB 三个值的线性组合,而所谓的 Linear 工作流的 Linear 的源头就是这里。

上述 RGB 是最原始的表达物理世界颜色的方法,它是线性的,也就是颜色的亮度的随着物理世界光强的增强而变化时是线性的,这完全没有问题,这正是我们所需要的物理世界的表达。但是,毕竟颜色是为了人眼来服务的,而人眼对物理世界光强的感知是非线性的,在光强较弱时,一点点的光强的增加人眼就能精确地观察到变化,但是在光强很强时,即便继续增加很多光强,人眼也很难区分出变化。下面是一张各种格式颜色的灰度(亮度)的分布情况,我们先只关注第一行:

可以看到,Linear TRC 这一行,它的颜色从黑到白的过渡是均匀,也就是所谓的线性的。但是,可以看到其中有很大范围的颜色是偏亮的(相比其他几行来说)所以,颜色数据存储的角度,如果颜色使用 Linear 的颜色来表示,即便我们花费了大概 50%的存储空间用来存储偏亮的颜色,最终人眼能感知到的也是很少的。并且,过多的偏亮的区域也挤压了偏暗的区域,这些人眼最容易观察到的颜色反而只有很少一部分。

所以,考虑到这个现象,我们进行颜色数据存储时,比如拍照时,我们会把从物理世界收集到的线性的颜色,做一个称为 Gamma 矫正的操作,使其变成上述第二行 sRGB TRC 的情况,这样,我们就会存储更多的偏暗的颜色,以此让照片能留下更多人眼能观察的信息。具体来说,这个操作就是对颜色值(0-1 范围)进行一个次方的计算,对于小数来说,它会被放大,表现来说就是颜色变亮。

但这还没完,我们的确通过 Gamma 矫正使得颜色的存储更加有效,但颜色值的确是发生了变化,这就不是物理世界的“真实”的颜色了,比如原本 Linear 的 rgb(0.5,0,0)变成了 sRGB 的 rgb(0.73,0,0),其数值不一样了。因此,最终显示阶段,比如显示器、手机屏幕、打印机等,还会做一次逆向的 Gamma 纠正,就对与颜色值再反向进行一个 次方的计算,那么颜色就又变回物理世界的真实颜色了。

这里要记住,对小数来说,$$ 会让颜色更亮, 会让颜色更暗

需要注意的是,看似一正一反的操作好像没有意义,但实际上前面正向的 Gamma 矫正主要是为了更有效的存储颜色数据,而后面的反向 Gamma 矫正恰好来源于 CRT 显示器的物理特性(它天然的就会对电信号起到一个 的影响),这一切都是浑然而成,无懈可击。

到这里,我们已经已经对物理世界的颜色、人眼所看到的颜色、显示器现实的颜色这三者的关系有所理解了,sRGB 就是服务于这三者的转换关系所诞生出来的颜色规范。


04 为什么要工作流转换,怎么转换



因为现实中可能存在不同公司不同团队之间不同规范的模型的交互,当我们在自己的 sRGB 工作流中想要使用 Linear 工作流中的一个模型,我们就必须要转换。举个例子:我们在浏览器 WebGL 环境中是以 sRGB 工作流为基准进行渲染的,但有很多 3dsMax 模型是在 Linear 工作流(未开启 Gamma 矫正)中制作的,所以如果我们不做转换直接使用,会发现这些模型会比它原来的颜色偏亮,就和上面的茶壶一样。

那么怎么转换呢?结论是要改颜色。为什么?我们来分析一下。

还是以上面茶壶为例,我们说过模型和现实世界的物体本质上是一样的,我们赋予模型的颜色就应该是物理世界它该有的颜色。但是,我们不是造物主,我们必须借助电脑屏幕和建模软件才能创造模型,这里就多了一层干涉,那就是显示器。显示器的反向 Gamma 矫正是固定存在的,是硬件里写死的,跟软件无关。当你在未开启 Gamma 矫正的建模软件里,调试你想要的颜色的时候,你所认为是“正确”的颜色,其实并不是物理世界它该有的颜色,因为显示器给你干扰了。这个干扰,是一个  的计算,它会让你看到的颜色变暗,也就是说,你必须在建模软件里把颜色调的更亮才能抵消这个干扰。所以你所认为“正确”的颜色实际上是更亮的颜色。这也就是为什么,你的颜色(黑灰)来到其他环境中后会变得更亮。所以,我们必须在 3dsMax 里把茶壶的颜色调的更暗。

具体多暗呢?因为 sRGB 工作流会主动对颜色进行 的提亮,就跟相机一样。那么我们让颜色反向变暗同样的数值就可以了,也就是对 3dsMax 里的颜色进行一个 的计算即可, ,如下图所示:

这里是比较让人困惑的地方, 最初是在照相时存储更多有效信息而诞生的,但是随着这个规范一直延续到现在,所有显示器都已经固化了 的计算,所以不管什么情况我们都得做一个 的计算才行了。

3dsMax

Babylon.js

可以看到,在 sRGB 环境里面,茶壶的颜色已经跟原来的 3dsMax 的颜色一样了。但是,现在的 3dsMax 变得更奇怪了,它太黑了,虽然结果是对的,但是这种不一致性是不利于美术资源的维护的。要解决这个问题非常简单,直接开启 Gamma 矫正就可以了:

3dsMax开启gamma矫正后

可以看到,物体的颜色值依然是 0.218,但是颜色已经正常了,即跟 sRGB 一样了。这就是 Gamma 矫正的作用,它就是主动用一个 来抵消显示器的 的干扰,正负抵消,从而让你能够在建模软件中以“物理世界的真实颜色”,赋予物体颜色。

最后,正负抵消后,其实你的颜色已经来到了 Linear 空间,这跟我们之前说的物理世界的真实颜色就是 Linear 空间的颜色。这样你建模出来的物体才跟现实世界的物体是等价的,这样你才能走通后续正向 Gamma 和逆向 Gamma 的过程。所以,开启 Gamma 矫正实际作用有两个:让你视觉看到的颜色位于 sRGB 空间,让你数据存储的颜色值位于 Linear 空间。

关于上方“开启 Gamma 矫正实际作用”的进一步解释:

看到最后,你可能会问:明明是从 Linear 转换到 sRGB,那么为什么最后开启 gamma 矫正后,你在 3dsMax 里调的颜色反而来到了 Linear 空间呢?实际上,这里略微有些歧义,所谓的 Linear 工作流就是指你的美术资源是在没有 gamma 矫正(变亮)的条件下制作的,但由于没有主动抵消显示器的干扰,在这种工作流下调试的颜色值会变得更大(前面分析过),也就会在 sRGB 下变得更亮,因此在 Linear 工作流下,其颜色值并非是 Linear 的。只有当我们开启了 gamma 矫正,主动抵消显示器的干扰,此时我们调试的颜色才“恰好”位于 Linear 空间。这也就是所谓的:让你视觉看到的颜色位于 sRGB 空间,让你数据存储的颜色值位于 Linear 空间。


05 团队介绍



三翼鸟数字化技术平台-筑巢自研平台」依托实体建模技术与人工智能技术打造面向家电的智能设计平台,为海尔特色的成套家电和智慧场景提供可视可触的虚拟现实体验。智慧设计团队提供全链路设计,涵盖概念化设计、深化设计、智能仿真、快速报价、模拟施工、快速出图、交易交付、设备检修等关键环节,为全屋家电设计提供一站式解决方案。

    _________________ END__________________

三翼鸟数字化科技
三翼鸟数字化技术团队官方订阅号,提供技术前沿洞察、技术实践分享、最佳实践整合、技术规范发布、团队文化输出。