LabPBR 材质标准
这是一个利用资源包中仅有的两张纹理存储材质信息的标准。其信息由光影进行解码,并使用这些信息进行基于物理的渲染 (PBR) 。但是需要注意法线纹理和反射纹理本身并不与 PBR 有任何直接关联。
这个格式由 shaderLABS Discord 服务器于 2019 年 4 月末发起创建并维护至今,旨在统一过去混乱的光影和资源包材质格式。
为了便捷,这个 转换器 可以帮助纹理创作家从绝大多数旧格式转换到 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 表示特定的硬编码金属。
这个区间的硬编码细节见 金属的工作原理。
对于纹理创作者
这个值可以视为材质的最小反射强度,因此当正视材质时小的值会产生更弱的反射,而大的值则会产生更强和更明显的反射。不同于传统高光度的是,这并不是反射强度的倍率,意味着平视材质(视线与表面接近平行时)时反射总是更强(称为“菲涅尔效应”,关于这个现象的更多信息见: 菲涅尔效应原理)。
蓝色通道
对于非金属/绝缘体:
值 0 ~ 64 表示孔隙率。 这里 有一些示例。
值 65 ~ 255 表示次表面散射强度。
孔隙率和次表面散射强度均以线性存储。
对于金属/导体:
暂留,以备将来使用。
对于纹理创作者
孔隙率表示材质可以吸收多少水分,这个值越高,被打湿(如下雨时)后表面颜色就会更暗并产生更弱的反射。这可以让同时支持孔隙率和基于天气变化的湿度(如雨天水坑)的光影产生更加准确的效果。下面是一些示例值。
材质 | 孔隙率 |
---|---|
沙子 | 64 |
羊毛 | 38 |
木头 | 12 |
金属和其他不透水材料 | 0 |
孔隙率的示例可以在 这里 找到。
Alpha 通道
可以设置为 0 ~ 254。0 表示 0% 发光强度,254 表示 100% 发光强度。
这个值以线性存储。
对于纹理创作者
低的值意味着更弱的自发光,高的值会产生更强的光照,但 255(不透明)会被忽略。
金属的工作原理
为了能够以有限的信息量更准确地表示金属,一些金属已被预定义,并且通过将绿色通道设置为 230 到 254 的特定值来选择。此时,反照率(颜色纹理)将用于对反射进行着色,而不是对漫反射着色。
如果你需要一个没有被预定义的金属,你也可以将绿色通道设置为 255 。这样反照率依旧会被用作 F0 ,这不太准确,但是也能产生相当不错的效果。
考虑到一些光影可能不支持预定义金属,这个区间的值都将被视为 255 。
金属 | 颜色值 | N (R, G, B) | K (R, G, B) |
---|---|---|---|
铁 | 230 | 2.9114, 2.9497, 2.5845 | 3.0893, 2.9318, 2.7670 |
金 | 231 | 0.18299, 0.42108, 1.3734 | 3.4242, 2.3459, 1.7704 |
铝 | 232 | 1.3456, 0.96521, 0.61722 | 7.4746, 6.3995, 5.3031 |
铬 | 233 | 3.1071, 3.1812, 2.3230 | 3.3314, 3.3291, 3.1350 |
铜 | 234 | 0.27105, 0.67693, 1.3164 | 3.6092, 2.6248, 2.2921 |
铅 | 235 | 1.9100, 1.8300, 1.4400 | 3.5100, 3.4000, 3.1800 |
铂 | 236 | 2.3757, 2.0847, 1.8453 | 4.2655, 3.7153, 3.1365 |
银 | 237 | 0.15943, 0.14512, 0.13547 | 3.9291, 3.1900, 2.3808 |
布局原理
对于红色和绿色通道的安排相当简单:
在大多数以前的格式中,红色代表平滑度。没有什么理由改变这一点。
在大多数以前的格式中,绿色表示金属性。定义“半金属”虽然不写实,但通常可以用于在一定程度上控制 F0 。
然后,我们只剩下两个通道用于自发光、孔隙率和次表面散射,所以其中必然有两个要存储在同一通道中。我们最终选择了孔隙率和次表面散射。
最后,将自发光存在 Alpha 通道中,允许纹理创作者更方便地将自发光与其余通道分离,然后将其并入反射纹理的 Alpha 通道,就像法线纹理中的高度图一样。
法线纹理 _n
法线纹理中不仅包含了法向量,还包含了环境光遮蔽和高度/置换图。法向量应被编码为 DirectX 格式(Y-),这通常被称为自上而下法线,表征为X轴/红色通道指向右,Y轴/绿色通道指向下。
材质环境光遮蔽(下称材质 AO)
AO 强度被存储于法线纹理的蓝色通道中。
法向量的第三分量
.z
可以使用sqrt(1.0 - dot(normal.xy, normal.xy))
进行重建。
这个属性以线性存储;0 表示 100% 遮蔽,255 表示 0% 。
高度图
被用于计算 POM 的高度图存储在法线纹理的 Alpha 通道中。值 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
初次规范。