【GAD翻译馆】PBR纹理变换
PBR纹理变换
翻译:龚斌涛(建筑学概论) 审核:徐明刚(日月青争)
发表时间:2015/9/1 发表网站:Toolbag Tutorials
标签:贴图;PBR;基于物理规则的渲染;高光;纹理;工具包
在这篇教程中,我会向大家说明传统渲染器下创建的贴图如何能够转换为PBR渲染器贴图,如何实现PBR工作流贴图向其他工作流的转换,以及这些工作流之间的差异。这篇教程适合高级业内人士阅读参考,所以请确保之前有阅读过Jeff Russell和我写的两篇PBR教程,里面有详细地介绍PBR中的一些基本概念,而在这篇教程中这些概念只会简单提及。
Basic Theory of Physically-Based Rendering —— Jeff Russell
Physically Based Rendering, And You Can Too! —— Joe Wilson
目录
PBR:误解与谬论
在开始之前,我想先澄清一些事情。目前为止,仍然有许多人对于究竟什么是PBR以及PBR中需要什么样类型的贴图存在疑惑。
首先,PBR系统并不要求一定是金属贴图(metalness map),使用了高光贴图(specular map)也并不意味着就一定不是“PBR”。我定期在论坛上有看到关于这方面的评论,当有人看到设计师在设计高光色泽贴图的时候,他们经常会问“为什么不用PBR?”,那么就让我来剖析一下究竟什么是PBR。
PBR基本概念是一系列复杂的处理真实物理和光照的渲染器的组合,以及一系列使用标准化的表示真实材质参数的贴图。本质上,PBR就是一个用于创建贴图和渲染工作的整体系统,在不同的工具和引擎的作用下会产生不同的实现效果(一般指渲染器模型和贴图的输入类型)。
此外,直接将非PBR贴图载入到PBR渲染器中进行渲染,并不能确保得到正确的真实效果。这种想法跟上面提及的“为什么不用PBR”一样被人们频繁误解。渲染器只是PBR中的一部分,要得到正确的真实效果,你还要考虑如何正确地校准以及使用PBR下的贴图。
最后一个问题,PBR会发生漫反射还是反射?这两者本质上是一件事,物体的固有色常常能够转换使用。
PBR:做了哪些改变
想要充分理解如何创建PBR贴图或者如何将之前模式下的贴图转换到PBR中,就必须要清楚PBR渲染器做了怎样的改变。其中一个最大的不同之处就是现代渲染器下光照的计算方式非常高级。如今PBR使用了动态光源和实时阴影技术,以及提供了基于图像的光照技术(image-based lighting)的精准环境漫反射和镜面反射。这也就意味着我们不用再去将光照、反射、阴影等直接绘制到贴图上。跟以往相比,我们就能将注意力转移到重现真实材质的属性上,而不用再去烘焙光照贴图。
此外,线性空间渲染使得我们不用再在高光贴图中使用漫反射的补色来获得真实的白色高光,同时PBR微表面算法中的能量守恒(表面越粗糙,漫反射越强,整体明暗越亮)将不再需要我们手动在高光贴图中构造粗糙(更黑)和光滑(更亮)的区域。这就意味着高光贴图通常只用为每种材质类型包含比数值多一点的信息(表示绝缘体的灰度等级,表示金属的色彩信息),而大部分的变化则会交给微表面贴图来定义。
传统工作流概述
为了展示现代渲染器和传统渲染器之间的不同,我在这使用之前创作出的狙击枪作品来举例。之所以用它来举例,是因为它能够展现出很多我之后不会在PBR系统中用到的典型方法,例如:
1. 漫反射贴图太暗,只能在特殊的光照环境中才能获得非常好的效果。
2. 环境光遮蔽(Ambient occlusion)和cavity细节直接绘制到了漫反射和高光贴图上了。AO/cavity应该通过单独的输入添加进去,这样能够让渲染器更加智能地使用它们。此外,大范围的AO更不应该直接添加到高光贴图中,因为阻挡光线并不等同于低反射表面(正如高光贴图所定义的那样)。
3. 渐变映射贴图的信息也被绘制到了漫反射贴图和高光贴图中。渐变映射贴图可以当做用来手动创建遮罩实现局部效果的工具(比如角色更低区域的脏的信息);但这绝不是将它直接绘制到贴图中的理由。
4. 这里使用的渲染器并不支持光泽贴图。这就意味着高光贴图必须同时尝试显示反射度和微表面细节,同时使用一个光泽度值来控制整体的材质效果。
5. 这里使用的高光值是通过眼睛测量的,而不是真实材质属性。那么结果导致了金属部分反射太强烈,同时还毫无理由地偏黄,而且塑料和橡胶部分的材质没有足够的反光。
贴图转换:传统贴图->PBR贴图
现在我们已经了解了传统渲染器和PBR渲染器之间的不同点,那么就可以在PBR工作流中进行人为地更新贴图信息。
首先,移除漫反射贴图和高光贴图中的光照信息和渐变映射信息。AO和cavity信息单独作为两张贴图,并放置到渲染器相应的位置上。然后,将漫反射贴图适当调亮一些。
由此,将高光信息(specular content)分解成一个光泽贴图和一个高光贴图。将原高光贴图中所有的表面信息移植到新建的光泽贴图中,然后更新这些值以使它们符合不同材质的微表面结构。如果光泽贴图已存在,那么再次确认这些值是否合理。例如,通常步枪底层的金属原料要比涂层的喷砂面更加平整/光滑,而光滑油漆层中的划痕则更显粗糙。
随着大部分纹理变化信息由高光贴图转移到光泽贴图上,我们就能将精力集中到反射率的思考和设置上。现在的关键点是区分物体哪些部分是金属材质,而哪些部分是非金属材质(当然,即便你并不使用metalness工作流)。理由非常简单,非金属的反射没有颜色并且反射率大概在4%的线性区间(或者#383838 sRGB),区间范围通常在2-16%(除了宝石以外很少有非金属会超过4%),与之相比金属的反射率则要高得多,一般介于70-100%。所以辨别清楚你所要表达的材质类型是非常重要的,这关乎找到正确的反射率值。
补充:如果金属物体被画上了或者涂上了其他不同的材质,那么在确定反射率值的时候就要作为非金属来考虑,除非是裸露的金属材质部分。
Metalness工作流 VS Specular工作流
在继续深入之前,我们应该要清楚Metalness工作流和Specular工作流的基本区别。大部分游戏引擎只支持两种中的其中一种;但是,Toolbag 2同时支持两种,这样就能让我们更直观地比较两者的优劣。
这两种工作流之间最大的不同之处在于怎样在贴图中呈现diffuse和reflectivity信息。在specular工作流下,这两者由明确区分的两种贴图来呈现。
另一方面,metalness工作流采用albedo map来同时包含diffuse和reflectivity信息,而metalness map则用于区分材质是金属还是非金属。这么做的原因是因为金属具有导电性,这就意味着绝大多数光子(即电磁波)会在其表面发生反射,而其余的光子则会被吸收而不是发生漫反射,所以金属没有漫反射的概念。相反地,绝缘体则会反射一小部分光(大约4%),而大部分的光则发生漫反射或者在物体表面弹射从而形成均匀分布的颜色。
这就意味着,在metalness工作流的操作中,大部分或者甚至所有的diffuse map和specular map(如果纹理中只包含金属或者非金属,但没有同时包含两者的情况下)就是浪费,但反过来说metalness工作流则更加高效。然而,在一张贴图中同时存储diffuse和specular信息也存在一个缺点,那就是在贴图中的材质过渡边缘会存在明显的白边块效应。
Gloss map和roughness map定义了相同的信息,但通常是相反的方向。在gloss map中,亮色表示光滑/光泽,而roughness map中亮色则表示粗糙/无光泽。在一些领域中,光泽度(glossiness)和反射率(reflectivity)意义相近,所以有人认为用roughness更不容易造成误解。当然,重要的并不是怎么命名,而是这些数值所代表的意思,如果还有疑问,可以去请教相关学者或工程师。
Specular workflow的优点 | Metalness workflow的优点 |
1. diffusion和reflectance有各自明确的输入,对于那些使用传统渲染器进行贴图绘制工作的美术来说更加适合。 | 1. albedo map定义了物体的固有色,完全不用去区分到底是什么材质,这对于美术来说在概念上更好理解。 |
2. 提供了一个完整的色彩输入,能够更好地控制非金属的反射值。 | 2. 简单讲材质分为金属和非金属两类,有可能对非现实材质的表现造成困难。 |
| 3. 占用更少的存储空间 |
Specular workflow的缺点 | Metalness workflow的缺点 |
1. 容易对reflectance赋予错误的值,从而造成错误的结果。 | 1. 金属过渡边缘存在白边块效应。 |
2. 比metalness workflow占用更多的存储空间。 | 2. 对于非金属的反射值缺乏控制和表现。 |
| 3. 如果不理解工作流,容易在metalness map中使用错误的逻辑值,导致系统瘫痪。 |
当然也有些metalness workflow提供了secondary specular map来对非金属的反射做更好的控制表现,但目前并不可能在Toolbag 2中出现。
有人觉得metalness workflow会更好理解;但个人观点,觉得都一样。每一种工作流都会因为使用了错误的逻辑值导致系统崩溃,大家可以根据自己的经验或者喜好去选择,或者说哪种容易上手就用哪种。本质上来说,没有哪种工作流比另外一种更好,它们仅仅只是不同罢了。
纹理转换:specular->metalness
现在已经有了正确的校准信息,并且已经知道了两种工作流之间的异同之处,所以实际上转换贴图是非常简单的。
首先,通过给所有的材质分配光泽度值来创建一个metalness mask(黑色表示非金属,白色表示金属,分配哪种值取决于表面是哪种材质)。如果你的贴图是PSD格式,那么从一系列图层中使用mask信息来构造金属贴图(metalness information)会更容易完成。Metalness map中绝大部分是以灰度值表示的白色和黑色信息,灰度值用于表示“半金属”、过渡、划痕或者脏痕迹等。然而,一般这十分罕见。因为通常而言,当金属物体表面覆盖了任何一种类型的涂料,金属物体则表现为绝缘体。
一旦你获得了metalness map,在PS中新建一个文件,用diffuse map做为背景层。然后,在其上用specular map创建一个图层,并且以metalness map作为specular层的蒙版层。这样,你就在metalness workflow中获得了合适的albedo map。
纹理转换:metalness->specular
Metalness workflow到specular workflow的转换也很简单。我们只需要将diffuse和specular信息从albedo map中分离出来,作为单独的diffuse贴图和specular贴图即可。
Diffuse Map
1. 新建文件将albedo map载入到Photoshop中
2. 创建一个黑色的填充层
3. 将metalness map复制到填充层的图层蒙版中
Specular Map
1. 新建文件,将albedo map载入Photoshop中
2. 创建一个色值为#383838的填充层
3. 将metalness map复制到填充层的图层蒙版中
4. 翻转图层蒙版
对比和说明
现在,我们可以来比较以上两种不同的转换工作流的有效性。
有件重要的事情需要在这说明一下,由于我们事先设置了标准合理的物理参数,所以整个的转换过程中工作正确。假如你的基本信息不是标准的,那么转换后的效果将会有很大的不同。同样地,如果你使用特定的材质,比如非金属的有色反射(通常十分罕见,在传统渲染器下最具代表性的就是头发或者闪光材质),那么在转换过程中会丢失部分信息。
所以,理想的情况是为自己选择的工作流制作相应的贴图,而不是仅仅依靠贴图转换来适应多个工作流系统。
材质逻辑(material logic)
那么我所说的合理的或者标准的物理参数是什么意思?不幸的是,这很难回答,因为这些值变化范围很大,取决于你想尝试用来表现哪种类型的材质。与其建立一个备忘单,还不如用我起的材质逻辑(meterial logic)这个名字来进行解释。
说明时附上图表和数据总是有些帮助的。首先,你不可能找到所有你想重建的材质数据,那么你就需要利用一些逻辑来决定什么样的值才是合适的。其次,同一材质类型的表面品质也会有显著的差异,这取决于一系列诸如年龄、耐久度、涂层等因素。
第一步需要做的事情就是分析出物体到底是由什么类型的材质做成的。对于很多物品来说,十分容易,通过照片就能够简单的说出它是金属还是塑料还是橡胶制成的。然而,其他一些物品则更为复杂,有可能是由多种材质共同组成得到的。那么,到网上搜索就可以了,找到参考图像或者现实中相似的物品去研究,甚至跑去观察物品是如何被制造出来的。
一旦你知道了它们是如何制成的,那么你就会得出一系列的结论。比如,金属的反射度比绝缘体更高,通常橡胶比塑料更加粗糙,混凝土的albedo比沥青更亮,等等。大部分的这些结论都能够通过简单的观察得出。
现在,你可以更加明确地知道你想让你的贴图拥有什么样的材质。比如,绘画常常由一系列不同的罩面漆构成(无光泽到有光泽),塑料也是一样。金属则变化相对较少,主要取决于其表面的光滑程度。
总之,使用PBR系统进行工作时,需要有与游戏美术一样的美术技巧,有观察并且复现你周围生活之中的材质的能力。了解PBR系统的基础概念是非常重要的;但是,最后你也需要相信你自己的美术直觉。
深入阅读
Basic Theory of Physically-Based Rendering – By Jeff Russell
Physically Based Rendering, And You Can Too! – By Joe Wilson