我们或许都在职场生涯中听过贴图有8位、16位、32位,那么全称应该是bit depth也就是位深这么个概念。然后也曾在知乎啊、百度、谷歌一搜一大堆关于图像位深的资料,十分冗长,看得人头皮发麻。大多数同学们可能都是用的8bit的贴图,对于游戏模型来说完全够用,直到有一天,我们学习过一些教程,让用16bit贴图(尤其是置换),甚至网络上传出来很多贴图素材,比如3dscan、xyz、vface,我去?怎么还有32bit的贴图,怎么高位深贴图在ps里操作起来还不太一样,诸如此类的问题一下就展开了。那么这篇推文就是关于位深这么个概念的解析,放心不会太长,咱们速战速决。
最简单的解释即:它定义了在图像中存储了多少个明度灰阶,以及这些灰阶分布在哪个范围内。具体到什么时候改用高位深以及低位深的贴图,我们还是需要深入研究一下。
我们从8bit开始,因为它也是最常用的一种位深,多用于网络图片,提供了良好的视觉体验,同时也不会占用太多磁盘空间/网络带宽,8bit一共有256个灰阶(每通道),能储存(0,1)的灰度值,也就是纯黑到纯白。8bit的灰阶渐变看起来是这样的:
由于这张色阶图大家看的太习以为常了,我们可能看不到任何问题,不过当我们做一些调整,比如类似调节置换贴图的应用场景中,我们需要一个level也就是色阶来加强置换,实际上是一个增强对比的操作。
下图展示了上图中的中间部分,方便大家看清
这回,我们可以很清楚的看到我们的贴图出现了色阶断层,那么这时候就需要高位深的贴图来表现贴图应该有的平滑过渡效果了。
另一种更高位数的贴图即16bit,16bit同样将灰度分配在(0,1)之间,唯一不同之处在于灰阶数量,我们的直觉可能会告诉我们16bit的灰阶应该是8bit的两倍,但是实际情况是,每增加1bit,就会有更多灰阶增加,并不是简单的两倍增加,而是256倍,也就是256灰阶的每一个灰阶基础之上再增加一个256灰阶过渡,那么我们现在有65536个灰阶了。(256*256=65536)
让我们来看看同样的16bit渐变灰度图使用相同的色阶命令后会有什么不同。
这一次并没有出现色阶断层,我们同时将8bit跟16bit贴图执行同样数值的色阶,就能肉眼观察到16bit的贴图进度有多高了。
可以看到上图,我把8bit图片已经压缩到只有黑白,也就是纯黑纯白各占一半,128个灰阶。同样的操作,16bit的图片仍然有512个灰阶,可以很好地表现灰阶过渡。
这里注意我是先创建了16bit灰度图,再单独转一个8bit的版本来测试的。
完事了,这就是位深。16bit的贴图完全够用了吧,然而并不是,仍然有两个概念需要提到。
我们为什么会需要更多的灰阶呢?有很多理由来说明65536个灰阶依然是不够用的,至少这里有两点来说明。
除了前面提到的基于整数的类型,这两种都属于Floats。这是什么意思?别担心,并没有想象中那么复杂,对我们来说重要的是,就像在编程中一样,整数用线性子步数来表示值,而 Floats 用指数子步数来表示值。通常使用指数子步长的图像格式的位深度为16位或32位。
这就是为什么我们现在有两个叫做16位的选项,这两个选项有着截然不同的特性。为了避免混淆,软件在它们的名字中引用了指数特性。令人恼火的是,这些命名约定还没有标准。
最明显的是:
也有一些软件会显示成Half/Float 或者16F/32F。
“半精度/浮点数”也是指编程,因为浮点数变量可以存储为位深度为32位的单精度浮点数值,也可以存储为16位的半精度浮点数值。这两个公式得到的指数增长是相同的这就是为什么我们也叫它们 Half 和 Float。
浮点数背后的指数公式有两个结果。
让我们仔细看看这些。
亮度范围
如前所述,8位和普通的16位不能存储在0.0到1.0范围之外的任何值,但是Half和Float实际上可以存储远远大于1.0的值,甚至可以存储负值。
如果你不再熟悉科学记数法,这里有一个快速复习。
3.4028 x 10³⁸ = 340,280,000,000,000,000,000,000,000,000,000,000,000
客观地说,比尔·盖茨的净资产不过是糟糕的96,300,000,000美元。让我们再举一个例子。计算一下地球上所有海滩和沙漠的所有沙粒,你会大致找到7.5 x 1018,这仍然比我们在浮动中的最大值小得多。
为了阐明这两个数字还有多小,我要举最后一个例子。如果你把地球上的每一粒沙子变成一个新的比尔·盖茨(包括他的财富),你仍然需要大约4.7亿个地球,才能达到我们可以存储在32位(浮点数)中的最大值。
我很想用一个图表来具象化这个过程,但是这个比例是如此的荒谬,以至于即使用对数图表,32位(Float)仍然会打破比例。相反,我有下面的图片给你们看,这将证明我们可以存储所有我们需要的信息。我已经将 HDRI 作为置换应用到两个平面上。唯一的区别是右图/HDRI 以8位存储,而左图/HDRI 以32位(half)存储。同样的 HDRI 也被用来照亮场景。
在这张 HDRl 图片中,太阳甚至不能直接看到,最亮的部分是你在第二张图片中看到的灯笼。我还看了一些未被剪切的 HDRI,其中包括直射阳光,但即使在那些,我测量的最亮值也没有超过340,000。直接的阳光会产生一些最极端的对比度,你将不得不存储在图像中,然而,即使阳光直射,我们从来没有得到接近32位(浮动)的最大值。这意味着我们可以自信地使用32位(Float) ,而不必担心丢失我们需要的任何数据。
灰阶
查看16bit(Half) ,让我们假设我们正在处理线性灰阶,这将给我们 ~ 65K 子步长。展开在16bit(Half)覆盖的全亮度范围内(- 65K 到65K) ,整个显示范围(0.0到1.0)甚至不会有一个灰阶。这就是为什么 Half 和 Float 使用不均匀大小的指数灰阶。换句话说,离0.0越远,我们的灰阶就会越大,或者反过来,离0.0越近,我们的灰阶就会越精确。
线性灰阶
指数灰阶
为了使比较更容易,我大大减少了这个示例中的灰阶。线性灰阶非常简单,但是对于指数灰阶来说,事情有点复杂。我们不再需要直接的指数灰阶来改变它们的大小,而是需要将我们的梯度划分成区域(蓝线)。每个区域都有相同数量的/近似的灰阶,但是覆盖的亮度范围是前一个区域的两倍。在我们的例子中,我们在0.25到0.5的范围内有4个线性灰阶,在0.5到1.0的范围内有4个线性灰阶。这意味着我们的值越接近于0就越精确,这对于正值和负值都是正确的。这就是为什么用0.0作为置换的中间值是一个好主意的原因之一。
但是,就精度而言,Half和Float与常规的8位和16位如何准确地进行比较?
对于 Half 和 Float 来说,0.0到1.0范围内最不精确的区域在0.5到1.0之间,但即使在这个范围内,16位(Half)也比8位多出8倍的灰阶。另一方面,如果你在0.5到1.0的范围内观察,普通的16位比16位(Half)精确32倍。如果你仔细观察,你仍然可以看到16位渐变中的相对灰阶。
Half是一个不错的选择,可以得到质量不错的纹理,不锁定在0到1,但如果你需要非常精细的灰阶(例如置换) ,那么你将不得不求助于32位(浮点数) ,因为它比普通16位(0.5到1.0范围)的256倍,更加精确。很好,你现在知道了成像的位深是如何工作的,但是还有一些我想提到的东西。重要的是要知道并不是所有的软件甚至文件格式都支持前面提到的位深度,所以我做了一个简单的总结。
考虑到字有点多,分两次推送。
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved