资讯
展览资讯 大型展会 灯光节 大型盛典 赛事 中标捷报 产品快讯 热门话题 艺术节 活动 演出 新闻 数艺报道 俱乐部签约
观点
大咖专访 观点洞察 书籍推荐 吐槽 设计观点 企业访谈 问答 趋势创新 论文 职场方法 薪资报价 数艺专访
幕后
幕后故事 团队访谈 经验分享 解密 评测 数艺访谈
干货
设计方案 策划方案 素材资源 教程 文案资源 PPT下载 入门宝典 作品合集 产品手册 电子书 项目对接
  • 0
  • 0
  • 0

分享

贴图位数到底是什么鬼东西?怎么用?

2023-09-18


我们或许都在职场生涯中听过贴图有8位、16位、32位,那么全称应该是bit depth也就是位深这么个概念。然后也曾在知乎啊、百度、谷歌一搜一大堆关于图像位深的资料,十分冗长,看得人头皮发麻。大多数同学们可能都是用的8bit的贴图,对于游戏模型来说完全够用,直到有一天,我们学习过一些教程,让用16bit贴图(尤其是置换),甚至网络上传出来很多贴图素材,比如3dscan、xyz、vface,我去?怎么还有32bit的贴图,怎么高位深贴图在ps里操作起来还不太一样,诸如此类的问题一下就展开了。那么这篇推文就是关于位深这么个概念的解析,放心不会太长,咱们速战速决。


最简单的解释即:它定义了在图像中存储了多少个明度灰阶,以及这些灰阶分布在哪个范围内。具体到什么时候该用高位深以及低位深的贴图,我们还是需要深入研究一下。


我们从8bit开始,因为它也是最常用的一种位深,多用于网络图片,提供了良好的视觉体验,同时也不会占用太多硬盘空间/带宽,8bit一共有256个灰阶(每通道),能储存(0,1)的灰度值,也就是纯黑到纯白。8bit的灰阶渐变看起来是这样的:



从这张图我们可能看不到任何色阶和问题,但如果我们对这张图进行调整,情况就不一样了。假如需要一张置换贴图,期初效果很弱,需要让它更强。这实际上与增强纹理的对比度相同。


下图展示了上图中的中间部分,方便大家看清

这回,我们可以很清楚的看到我们的贴图出现了色阶断层,那么这时候就需要高位深的贴图来表现贴图应该有的平滑过渡效果了。


另一种更高位数的贴图即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个灰阶依然是不够用的,至少这里有两点来说明。


  • 需要储存比1/纯白更亮的值(比如用于HDRIs,用于后期grading)

  • 需要存储负值(对置换很有用)


除了前面提到的基于整数的类型,这两种都属于Floats。这是什么意思?别担心,并没有想象中那么复杂,对我们来说重要的是,就像在编程中一样,整数用线性子步数来表示值,而Floats用指数子步数来表示值。通常使用指数子步长的图像格式的位深度为16位或32位。

这就是为什么我们现在有两个叫做16位的选项,这两个选项有着截然不同的特性。为了避免混淆,软件在它们的名字中引用了指数特性。令人恼火的是,这些命名约定还没有标准。

最明显的是:

  • 16-bit (Half)

  • 32-bit (Float)


也有一些软件会显示成Half/Float 或者16F/32F。

“半精度/浮点数”也是指编程,因为浮点数变量可以存储为位深度为32位的单精度浮点数值,也可以存储为16位的半精度浮点数值。这两个公式得到的指数增长是相同的这就是为什么我们也叫它们Half 和Float。

浮点数背后的指数公式有两个结果。

  • 亮度范围在0.0到1.0之外
  • 灰阶的大小不均匀

让我们仔细看看这些。
亮度范围
如前所述,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 10¹⁸,这仍然比浮动中的最大值小得多。
为了阐明这两个数字还有多小,我要举最后一个例子。如果你把地球上的每一粒沙子变成一个新的比尔·盖茨(包括他的财富),你仍然需要大约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位的精度相比如何呢?

我们首先比较8位和16位(Half)。在下面的示例中,子步数已大幅减少,但8位与16 位(Half)的子步比例保持不变。

对于Half和Float来说,0.0到1.0范围内最不精确的区域在0.5到1.0之间,但即使在这个范围内,16位(Half)也比8位多出8倍的灰阶。另一方面,如果你在0.5到1.0的范围内观察,普通的16位比16位(Half)精确32倍。如果你仔细观察,你仍然可以看到16位渐变中的相对灰阶。

不锁定在0到1,Half是一个不错的选择,可以得到质量不错的纹理,但如果你需要非常精细的灰阶(例如置换) ,那么不得不求助于32位(浮点数) ,因为它比普通16位(0.5到1.0范围)的256倍,更加精确。很好,你现在知道了成像的位深是如何工作的,但是我还想说下其他的事,要知道并不是所有的软件甚至文件格式都支持前面提到的位深度,所以我做了一个简单的总结。

JPG格式也在这个列表中,因为它可能是所有格式中最知名的格式,但我不建议将其用于预览图像、绑定纹理或网络使用之外的任何其他用途。此外,还必须注意软件,因为有时候软件不支持某种位深度,即使正在使用的文件格式可以支持它。下面的例外可能不是唯一的,但是这些是我过去观察到的。

Substance Painter:

16bit(half)(可以在half下工作,但是导出exr或者tif格式时并不支持,然而EXR格式的压缩方式意味着虽然有32bit位深,文件大小以及实际数据更接近16bit half)

Photoshop:

无效的:16bit(half) (导入的时候会被自动转换为32bit float)

编辑:尽管Photoshop将EXR导入列为32bit(float) ,但EXR的导入和导出实际上仅限于16bit(half)。包括真正的32bit(float)导入!这是一个巨大的限制。

Mari:

16bit(绘制节点,图层并不支持常规16bit)

总结

是时候看看什么对你有意义了,因为我做VFX工作,专注什么是最合适的。不过,像游戏可能需要更多地关注性能。首先最重要的是,像JPG 8位应该尽量避免使用,但用于预览,绑定过程,网页除外。8位根本不能提供足够的数据让你在之后的流程中有可调整的空间。如前所述,在游戏项目中可能出于性能的考虑而依赖8位贴图纹理。

Displacement

这可能是正确使用位深度产生影响最大的地方。即使根本不调整你的贴图,8位的质量也太低了,不能给你满意的结果,这取决于你的模型,你最终会得到像左边的例子(那些不是毛孔)那样非常粗糙的结果,或者像右边的例子一样带状断层效果,这比噪波更加难看。

16位(half)也不适合置换,所以你可以使用常规的16位或32位(浮点)。虽然32位(浮点)会使用更多的硬盘空间,但它允许你将置换强度烘焙到你的纹理中,而不会担心失去质量。

其他贴图(颜色、镜面反射、粗糙度等)

其他纹理(颜色,镜面反射,粗糙度等)像颜色和镜面粗糙度这样的纹理不需要32位(浮动)的全部范围。事实上,颜色和粗糙度都不应该超过0.0到1.0的范围,所以使用16位(半)或32位(浮动)存储有点浪费。

但归根结底,事情并不总是像看起来那么容易。你会选择哪个选项很大程度上取决于你所使用的软件。理想情况下,你会想要使用16位,但并不是所有的软件都支持16位。如果是这种情况,你会想要使用16位(Half)。一个很好的例子是Mari。另一方面,如果你使用Substance Painter,你可以导出为常规的16位,除非你想使用EXR。因为Substance不支持16位(Half),EXR也不支持常规的16位,所以你必须改用32位(浮点)。

最后的总结

大多数做后期合成的人都希望能在一个EXR文件中处理多个通道,这样节点不至于那么混乱,EXR自动排除了8bit以及16bit,但可能你不想使用它们,因为不想丢失大于1.0的值,因为这些值对于Bloom或调整后期曝光等非常重要。
使用16bit(half)还是32bit(float)可能会根据每个项目的不同而有所不同。这基本上是为了平衡软件的性能,因为处理32位(float)可能会慢得多。


原文链接:
https://www.artstation.com/blogs/andreasmischok/D0AG/what-the-hell-is-bit-depth


- End -

阅读原文

* 文章为作者独立观点,不代表数艺网立场转载须知

本文内容由数艺网收录采集自微信公众号CG世界 ,并经数艺网进行了排版优化。转载此文章请在文章开头和结尾标注“作者”、“来源:数艺网” 并附上本页链接: 如您不希望被数艺网所收录,感觉到侵犯到了您的权益,请及时告知数艺网,我们表示诚挚的歉意,并及时处理或删除。

数字媒体艺术 新媒体艺术 科技艺术

14212 举报
  0
登录| 注册 后参与评论