前言

因为不知道什么原因(可能是因为终末地工业模组当时有人留言,关于PBR材质的一些事情),然后就去了解了一下Minecraft的材质包

然后就找到了一个LabPBR标准,简单学习了一下,记一点笔记吧

游戏领域

之前折腾UE场景的时候,我也初步了解过PBR,它的全称是Physically Based RenderingPBR是一种基于物理的渲染标准,
PBR的材质属性,如金属度 Metallic粗糙度 Roughness环境光遮蔽 Ambient Occlusion自发光 Emissive等等,都是基于物理的公式进行运算的

游戏开发领域,尤其是次世代类型的游戏,材质的表现尤其重要,所以也会使用PBR材质

常规的PBR材质,包括基础颜色贴图 Base Color法线贴图 Normal,和上面的那些

基础颜色贴图,就是我们最常用的贴图,用于指定方块或者物品的材质颜色,比如地板,假设它是棕色地板,那么它的基础颜色就是棕色

法线贴图,用于指定方块或者物品的材质的法线,用于计算光照,比如还是地板,它的凹凸感可以从法线贴图里面得到

当然,提及凹凸感,与之相关的还有一个置换贴图,相比法线贴图,它会带来更真实的凹凸

法线贴图依旧是平面,它是依赖图中存储的法线信息模拟光照的,在一些角度下,比如视平面接近材质表面,很容易看出来它还是一个平面;
而置换贴图,它会真正改变模型的形态,比如很多山体,其实是通过置换贴图做出来的(当然,平面的细分得足够多)

剩下的,往往就会并在一张贴图里, 因为金属度,粗糙度这种,其实都是用线性空间表示的(0~255),正好可以塞在某个通道图里面

所以接触过PBR材质的同学,除了基础颜色和法线贴图外,还应该见过一张看起来很奇怪的图,那就是叠了几个通道的贴图,在制作材质时,用的实际上是他们的各个通道

比如我之前在自己折腾的时候搞的

1

LabPBR

关于LabPBR标准的由来,可参见以下引用内容,源自LabPBR 材质标准

这个格式由 shaderLABS Discord 服务器于 2019 年 4 月末发起创建并维护至今,旨在统一过去混乱的光影和资源包材质格式。

This format has been created in the shaderLABS Discord (explaining the name) on the end of April 2019, and improved since. It is intended to replace all previous formats in order to achieve a more consistent support across different shader and resource packs.

当然,在Minecraft中,因为渲染系统的不同,LabPBR标准是对上述常规的PBR标准做了特化处理,以更好地适应Minecraft的渲染系统

未来,Minecraft也将抛弃OpenGL,改为使用Vulkan,更加高级的材质确实可能会在未来越来越多

所以其实如果只是为了绘制材质包,标准的PBR流程不了解也没有关系,不过最好还是可以了解一下

其实除了LabPBR标准,还有seusPBR标准,但我没找到相关的文档,猜测它可能是和SEUS系列光影有关的,
不过本篇文章仅讨论LabPBR标准(以下简称标准),感兴趣的同学可以自己去研究

那么下面,我们也来简单了解一下这个 标准 吧

注意:LabPBR标准,并不是Minecraft官方制定的标准,原生的游戏并不支持,需要相应的光影才能体现出效果

工作流

我就介绍我自己的工作流和使用的软件

1
2
3
4
5
6
7
8
9
10
11
12

绘制16x的基础颜色贴图
/ \
/ \
Blockbench放大至64x 还是到BB里,分离RGB通道,分别绘制各个通道
/ \ \
/ \ 完成后合并通道,并放大64x
/ Materialize制作法线贴图 \
/ \ 导出,作为反射纹理
/ \
导出,作为新的基础颜色贴图 导出,作为法线纹理

没用思维导图画,就这样吧

大体上的工作流程就是这样,当然我也不知道真正的流程是什么,毕竟这方面的教程很少,几乎没有

后面来一点点介绍

基础颜色贴图

这是最基础的贴图,也就是指定我们的方块或者物品它基本的材质,它长什么样,这和上面的是一样的

以我们模组开发中的老朋友raw_ice_ether_block为例,它就是这种最普通的贴图

2

法线贴图 _n

注:此部分只做制作法线贴图的方法,不对 LabPBR标准 中的法线贴图进行描述;

因为说实话,LabPBR标准 中制定的法线贴图规则是特化处理的,它的法线贴图,除了法向量外,还有AO和高度/置换贴图;

但实际游戏开发中,AO和高度/置换贴图是额外的贴图,并不是和法线夹在一起的(当然AO可能会和金属度、粗糙度放在同一张图的RGB三个通道里)

在这里,我们只生成法线贴图,不管它这里所描述的AO和高度/置换贴图

标准中,它的后缀名相比基础颜色贴图会多带一个_n

比如这样:

3

不过细心的小伙伴或许已经发现了,这个图的分辨率一般不会是原生的16x,毕竟太低了,最少也要用32x的,不然很难看出来效果

不少带法线贴图的材质包,虽然看起来分辨率还是16x的,但实际上拆开来就能发现,它至少是32x的

那么可能有人就要问了,这么高分辨率的,画基础颜色贴图的时候会不会很麻烦?

当然不会,你可以只画16x的,再通过软件扩充至32x或者64x,但保持视觉上仍旧是16x

这个可以通过Blockbench来完成,很方便,PS没那么方便,而且会多很多不知道什么玩意的数据

工作流程就像上面说的那样

接下来就是制作法线贴图了,法线贴图并不是我们画出来的,它是通过程序算法生成的

碎碎念:应该不是画的吧?那一堆紫色的玩意一般我们也画不出来吧?它的RGB三个通道存储的可是三维的向量数据,这不是我们瞎编就能编出来的

不过由于MC的特殊性,一些作者可能也会手动改图

由于PS高版本里面的3D功能被移除了,所以我就用了Materialize来生成法线贴图,它是一个基于U3D的开源的贴图生成软件,还挺好用的

那么以下就是基本的步骤:

  1. 导入基础颜色贴图,按Diffuse Map中的O,打开一张图片导入;
  2. 生成高度图,稍微调整一下设置,可以参考预览来调整;因为法线贴图的生成需要高度图,所以先要生成一张高度图 4
  3. 再生成法线贴图,需要把它的Pre Contrast降低,得到较为纯净的,偏向统一的蓝紫色的图,当然不要调太低,不然细节都没了 5

注意,LabPBR标准中的法线贴图采用的是DX格式(Y-),不过这个软件默认生成的法线贴图是Max Style的,也就是DX格式的,不用我们再翻转了

然后导出就能得到法线贴图了

反射纹理 _s

注:这个贴图倒是和标准的PBR差不多,但也做了一定的特化处理

标准中,它的后缀名相比基础颜色贴图会多带一个_s

光影只需要满足能正确处理光滑度(红)和 F0 (绿)即为 LabPBR 完备,其他定义的材质信息是可选项。

以上引用说明,针对这张反射纹理,如果你没有特殊需求,其实把红色和绿色通道画好了就没问题了,这张图就可以被光影识别了

不过我们还是把这张图的RBGA四个通道都来介绍一下吧

关于绘制方面,依旧是用Blockbench来绘制,不过要注意分离通道,分别绘制各个通道

6
另外,在绘制时,比如说你在绘制R通道,那么就只调节R的颜色值,G和B的值都归,以此类推;
透明度则可在完成绘制后,再次合并分离的三个图层,再来绘制透明度

在绘制过程中,强烈建议备份文件,以方便回滚

红色通道 R

在标准中,它代表的是粗糙度

255代表完全光滑,0代表完全粗糙(这里的值代表各个通道的颜色值)

比如瓷砖表面,是很光滑的,那么它的值会趋近于255;而沙土,则会很粗糙,那么它的值会趋向于0

绿色通道 G

在标准中,它代表的是F0,也就是金属度

不过注意,0~229是常规的材质使用,230~255则是一些金属特定的硬编码值(光影如果不支持,那么这个区间的值会被默认识别为255)

这个值越大则表现出的金属感越强

结合上面的粗糙度,你可以做一个具有磨砂感的金属材质,那么就是R趋近0,G趋向255(当然,因为本来分辨率就不高,可能表现效果不会很好)

蓝色通道 B

在标准中,它目前是给非金属/绝缘体材质使用的,对于金属/导体暂时没有规定

0~64代表孔隙率,65~255代表次表面散射强度

孔隙率表示材质可以吸收多少水分,这个值越高,被打湿(如下雨时)后表面颜色就会更暗并产生更弱的反射。
这可以让同时支持孔隙率和基于天气变化的湿度(如雨天水坑)的光影产生更加准确的效果。

比如沙子很容易吸水,它的这个值就是64,下雨时颜色就会更暗

次表面散射(Subsurface Scattering),简称SSS或3S,指光线穿透透明或半透明材质时在内部发生散射后从其他位置出射的现象,
属于物理学与计算机图形学交叉领域的光学现象。(百度百科)

但标准没有对这个做更多的解释,我也没研究过,大概是用来模拟更好的光影效果的

透明通道 A

在标准中,它代表自发光强度

0~254代表自发光强度,值越大则代表强度越大,但255(完全不透明)会被忽略

使用贴图

在完成各个贴图的绘制之后,导出他们,并带上相应的文件名,把他们放到材质文件中,然后就可以使用了