LabPBR 材质标准

这是一篇翻译文档

这篇文档翻译自 LabPBR Material Standardopen in new window ,请以原文为准!

这是一个利用资源包中仅有的两张纹理存储材质信息的标准。其信息由光影进行解码,并使用这些信息进行基于物理的渲染(PBR)。但是需要注意法线纹理和反射纹理本身并不与 PBR 有任何直接关联。

这个格式由 shaderLABS Discord 服务器于 2019 年 4 月末发起创建并维护至今,旨在统一过去混乱的光影和资源包的材质格式。
为了便捷,这个 转换器open in new window 可以帮助纹理创作家从绝大多数旧格式转换到 LabPBR。

反射纹理 (*_s)

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

红色通道

  • 代表“感知”平滑度。
    • 使用 粗糙度 = pow(1.0 - 感知平滑度, 2.0) 来将感知平滑度转换到线性粗糙度。
    • 使用 感知平滑度 = 1.0 - sqrt(粗糙度) 来将线性粗糙度转化为感知平滑度。

对于纹理创作者

值 255(100%)表示材质完全光滑(例如磨制花岗岩);值 0(0%)则是粗糙的材质(例如石头)。

绿色通道

  • 值 0 ~ 229 表示 F0,也叫反射率。
    • 这个属性以线性存储。请注意值 229 实际上表示 229/255 ,即约 90%,而不是 100%.
  • 值 230 ~ 255 表示特定的硬编码金属。
    • 这个区间的硬编码细节见 下文

对于纹理创作者

这个值可以视为材质的最小反射强度,因此当正视材质时小的值会产生更弱的反射,而大的值则会产生更强和更明显的反射。不同于传统高光度的是,这并不是反射强度的倍率,意味着平视材质(视线与表面接近平行时)时反射总是更强(称为“菲涅尔效应”,关于这个现象的更多信息见:菲涅尔效应原理open in new window)。

蓝色通道

  • 对于非金属/绝缘体:
    • 值 0 ~ 64 表示孔隙率。这里open in new window 有一些示例。
    • 值 65 ~ 255 表示次表面散射强度。
    • 孔隙率和次表面散射强度均以线性存储。
  • 对于金属/导体:
    • 暂留,以备将来使用。

对于纹理创作者

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

材质孔隙率
沙子64
羊毛38
木头12
金属和其他不透水材料0

孔隙率的示例可以在 这里open in new window 找到。

透明度通道(Alpha)

  • 可以设置为 0 ~ 254。0 表示 0% 发光强度,254 表示 100% 发光强度。
  • 这个值以线性存储。

对于纹理创作者

低的值意味着更弱的自发光,高的值会产生更强的光照,但 255(不透明)会被忽略。

金属的工作原理

为了能够以有限的信息量更准确地表示金属,一些金属已被预定义,并且通过将绿色通道设置为 230 到 254 的特定值来选择。此时,反照率(颜色纹理)将用于对反射进行着色,而不是对漫反射着色。

如果你需要一个没有被预定义的金属,你也可以将绿色通道设置为 255 。这样反照率依旧会被用作 F0 ,这不太准确,但是也能产生相当不错的效果。

考虑到一些光影可能不支持预定义金属,这个区间的值都将被视为 255 。

金属颜色值N (R, G, B)K (R, G, B)
2302.9114, 2.9497, 2.58453.0893, 2.9318, 2.7670
2310.18299, 0.42108, 1.37343.4242, 2.3459, 1.7704
2321.3456, 0.96521, 0.617227.4746, 6.3995, 5.3031
2333.1071, 3.1812, 2.32303.3314, 3.3291, 3.1350
2340.27105, 0.67693, 1.31643.6092, 2.6248, 2.2921
2351.9100, 1.8300, 1.44003.5100, 3.4000, 3.1800
2362.3757, 2.0847, 1.84534.2655, 3.7153, 3.1365
2370.15943, 0.14512, 0.135473.9291, 3.1900, 2.3808

布局原理

对于红色和绿色通道的安排相当简单:

  • 在大多数以前的格式中,红色代表平滑度。没有什么理由改变这一点。
  • 在大多数以前的格式中,绿色表示金属性。定义“半金属”虽然不写实,但通常可以用于在一定程度上控制 F0 。

然后,我们只剩下两个通道用于自发光、孔隙率和次表面散射,所以其中必然有两个要存储在同一通道中。我们最终选择了孔隙率和次表面散射。

最后,将自发光存在透明度通道中,允许纹理创作者更方便地将自发光与其余通道分离,然后将其并入反射纹理的透明度通道,就像法线纹理中的高度图一样。

法线纹理 (*_n)

法线纹理中不仅包含了法向量,还包含了环境光遮蔽和高度/置换图。法向量应被编码为 DirectX 格式(Y-),这通常被称为自上而下法线,表征为X轴/红色通道指向右,Y轴/绿色通道指向下。

材质环境光遮蔽(下称材质 AO)

  • AO 强度被存储于法线纹理的蓝色通道中。
    • 法向量的第三分量( .z )可以使用 sqrt(1.0 - dot(normal.xy, normal.xy)) 进行重建。
  • 这个属性以线性存储;0 表示 100% 遮蔽,255 表示 0% 。

高度图

  • 被用于计算 POM(视差遮蔽映射)的高度图存储在法线纹理的透明度通道中。值 0(在高度图中为纯黑色)表示方块的 25% 深度。
    • 注意:高度图值为 0 会导致一些光影的 POM 出现问题,所以建议值至少为 1 。

布局原理

AO 存储在蓝色通道中,因为法线纹理中每个像素的前三个分量表示长度为 1 的矢量。由于我们知道长度,我们只需要三个分量中的两个即可重建向量(感谢毕达哥拉斯)。这意味着三个通道中的一个可以用于其他用途,比如将 AO 存储在蓝色通道中。

版本历史

LabPBR v1.3

  • F0 现在以线性存储。
  • 过去的线性 F0 通过取其平方根来存储,并通过平方来解码。

LabPBR v1.2

  • 更改了材质 AO 在法线纹理中的存储方法。
  • 过去的材质 AO 以下列方法编码:
    • 将法线调整到 [-1, 1] 并归一化。
    • 将值域为 [17, 255] ,以 sqrt() 存储的材质 AO 乘入。
    • 将法线调整回 [0, 1] 。
    • 在将法线贴图的范围调整到 [-1, 1] 后,AO 和法线按以下方式解码:
      • 法线 = normalize(法线纹理.rgb)
      • ao = length(法线纹理.rgb)

LabPBR v1.1

  • 新增硬编码金属。
  • 重新安排了自发光、次表面散射和孔隙率,依照其重要性和用途分配精度。

LabPBR v1.0

  • 初次规范。