全国 【切换城市】欢迎您来到装修百科!
关注我们
我要装修

贴图位数到底是个什么鬼东西?(贴图的格式是什么)

发布:2024-12-23 浏览:26

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

我们或许都在职场生涯中听过贴图有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个灰阶依然是不够用的,至少这里有两点来说明。
需要储存比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 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倍,更加精确。
很好,你现在知道了成像的位深是如何工作的,但是还有一些我想提到的东西。
重要的是要知道并不是所有的软件甚至文件格式都支持前面提到的位深度,所以我做了一个简单的总结。
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位通常应该被避免,例外情况是用于图片预览,rig过程使用,网页图片使用。
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,所以你不会想用EXR的,因为你并不想失去大于一的值,这些值对于后期调节bloom,exposure曝光非常重要。
您使用的是16bit(half)还是32bit(float)可能会根据每个项目的不同而有所不同。
这基本上是为了平衡软件的性能,因为处理32位(float)可能会慢得多。

  • 收藏

分享给我的朋友们:

上一篇:重庆也有南书房?20平方米两间屋子?工作人员说 下一篇:未来房价走势(郑州未来房价走势)

一键免费领取报价清单 专享六大服务礼包

装修全程保障

免费户型设计+免费装修报价

已有312290人领取

关键字: 装修报价 装修网 装修风格

发布招标得免费设计

申请装修立省30%

更多装修专区

点击排行