Adapting PBR Textures to Source

From Valve Developer Community
Jump to navigation Jump to search
English (en)中文 (zh)Translate (Translate)

近年来,基于物理渲染(en)(PBR)的纹理及其相关工作流程已经成为最新的行业标准。起源(en)引擎由于年代久远而无法利用之,结果无缘于最新、最优秀的纹理技艺。虽然已经有了修改起源引擎以适应PBR(en)的尝试,但真正对地图制作者有用的是修改PBR以适应起源引擎。本教程就是这样一个尝试。

目前,网上很难找到正式的研究,但依然可以凭经验推出一套转换公式。

本教程针对的是固体(en)材质,所以略过了比较复杂的冯氏贴图(en)。确保你有一个图像处理程序来做这些转换。

分析

首先,了解起源引擎和PBR的做法及其区别是很有帮助的。本质上讲,包括起源引擎在内的传统方法针对的是渲染结果;而PBR纹理针对的则是材质的物理性质,然后通过人类的理解去推测渲染结果。

具体而言,起源引擎的材质通常包含以下层次:

有时会通过SS法线贴图(en)作为AO(环境光遮蔽)贴图。为了简单起见,本文将忽略之,只考虑基本的三种贴图。

这种三层次的逻辑很简单。一个表面的总反射率被分解为两个类别:漫反射和镜面反射,分别由漫反射贴图和镜面反射贴图来表示,而局部的凹凸由法线贴图来表示。

PBR纹理技艺因提供者而异。显然每位纹理家都有各自的做法,但非金属纹理的设定通常包括:

  • 漫反射贴图(又称基本颜色)
  • AO
  • 位移贴图(又称高度贴图(en)
  • 粗糙度贴图(或者光滑度贴图)
  • 法线贴图

有金属性的纹理会使用一种附加的贴图,要么是镜面反射贴图,要么是金属度贴图。关键在于理解每个贴图对漫反射率和镜面反射率的影响,然后才能在Source中把它模仿出来。

非金属

对于非金属材料,我们只需要建立一系列函数,把PBR的五张贴图转换成起源引擎的三张贴图。

法线贴图

法线贴图的技术这些年来毫无改变,所以可以直接拿到起源引擎去。绿色通道是否需要反转依然要看具体情况;虽然这跟PBR没有关系。

法线起源 = 法线PBR

位移贴图

这张贴图表示的是表面的位移或者说高度。法线贴图应该已经反映了这些信息,所以这张贴图可以直接无视。但当没有AO的时候,也可以把位移贴图嵌入漫反射贴图或者法线贴图的蓝色通道里面。把它的不透明度调到不超过25%,然后滤色、相乘或叠加原始图层。

如果你对上述建议感觉过于笼统,那么尝试:

漫反射起源 = 相乘 ((12.5%) 位移PBR, 漫反射PBR)

AO

这张贴图决定了来自环境光的反射率。由于起源引擎并不支持对固体的环境光遮蔽,它必须被嵌入漫反射贴图。理论上它应该与漫反射贴图相乘,但较高的不透明度会使结果看起来很阴森。可以从25%的不透明度开始。

漫反射起源 = 相乘 ((25%) AOPBR, 漫反射起源)

另一种方法是在混合之前用色阶增加其亮度,如图所示。

在PBR纹理的AO嵌入漫反射贴图之前对其使用色阶

尝试把它以50%的不透明度与漫反射贴图相乘。

粗糙度贴图

粗糙度贴图比较棘手,因为它跟漫反射率和镜面反射率都有关系。一个粗糙的表面反射较少的镜面光和更多的漫反射光,反之亦然。这里适用能量守恒定律,意味着

漫反射 + 镜面反射 = 常数

但以人类的方式平衡这个方程是不切实际的,所以一些创造力就很有用了。对粗糙度贴图反转之后应用一个曲线可以得到一个令人满意的镜面反射贴图的结果:

镜面反射起源 = 曲线 (1 - 粗糙度PBR, 108 > 0, 208 > 112)) 在sRGB中

曲线看起来如下:

将反转的粗糙度贴图转换为镜面反射贴图的曲线

该函数的一个有趣的结果就是高于64% sRGB的粗糙度会得到零的镜面反射。这种纹理大多是粗糙的土地、纺织品、混凝土等。在起源引擎的习惯中,这些材料确实一般没有镜面反射贴图。

取而代之,可能更好的做法是给这种粗糙的表面增加漫反射率。一个可能的方案是:

漫反射起源 = 变亮 ((25%) 曲线 (粗糙度PBR, 127 > 0, 191 > 16, 255 > 64), 漫反射起源) 在sRGB中

曲线看起来如下:

将粗糙度贴图转换为漫反射贴图的表层的曲线

金属

按照定义,金属材料是很少见的,因为现实中见到的大部分金属都是氧化的或者上了漆的,这些属于非金属范畴。它们并没有裸露的金属表面。然而,从一些纹理样本中可以看到,某些陶瓷也可以有一定程度的金属性。

下面的例子展示了一张瓷砖纹理,整体粗糙度比较一致,但镜面反射率不同。镜面反射贴图中较亮的地方代表附加的金属性。

展示不同金属性的陶瓷纹理示例

这种附加的金属性按理应该带来较高的镜面反射率。因此,除了以上步骤以外,还可以再应用一个函数。

镜面反射起源 = 滤色 (镜面反射PBR, 镜面反射起源)

至于那种少见的,裸露的金属,现实中它的漫反射率几乎为零。人所感知到的颜色几乎全是由镜面反射带来的。然而,在起源引擎中,只有漫反射可以被其他表面以漫反射和镜面反射的形式接收。镜面反射则只能被其他表面以相同方式接收,即使如此,也要求多次运行buildcubemaps(en)。如果你不打算纠结于buildcubemaps和满地图到处放辅助光源,把感知颜色作为漫反射贴图依然值得推荐,跟非金属一样。金属和非金属不应该有任何区别。

所以如果纹理的漫反射贴图几乎是黑的,考虑用镜面反射贴图把它照亮。其他过程应该跟非金属大同小异。

结论

至此,你应该已经有办法为起源引擎制备漫反射贴图、镜面反射贴图和法线贴图了。之后,你可能想要用老办法创建材质(en)

Note.png注意:镜面反射贴图通常是嵌入法线贴图的阿尔法通道的,所以你无需把它导出给文件系统。

本教程的公式是要给出比较中庸的风格,所以在一些特殊情况下不好用并不奇怪。笔者鼓励你自行尝试。实际上,更常见的是调整纹理以适应你的地图,而非试图重现原貌。

参见