街霸6Mod制作入门3-纹理与贴图

街霸6Mod制作入门3-纹理与贴图
止一寺前言
大多数游戏公司都会在开发中拥有自己的一套美术流程体系,因此很多贴图是没有办法完全确定其功能的。下文的讲解大都基于已有的 mod 制作者的测试结果和使用体验,同时参考了 RE Mesh Editor (下文简称 REME)的源代码,并不全面也不保证正确,想要更好的效果还请多多尝试。
一、获取与打包贴图
纹理贴图常见的格式是 dds 或者 tga。
dds 可以通过 Visual Studio 直接打开并编辑,但作为一个 IDE,它绘制图像的能力只能说实在不强,只是可以很方便地查看图像地部分属性与分通道效果。Blender 内也是可以直接预览并编辑 dds 贴图的,习惯在 Blender 内绘制的用户可以在安装了 RE Mesh Editor 的情况下直接将 RE Engine 的纹理文件拖入 Blender 处理。除此以外,dds 也可以用 ps 搭配插件进行编辑。
相比 dds 格式,个人认为 tga 编辑起来更加友好,而且受更多图像处理工具原生支持。tga 基本是一个类似于 png 的图像形式,在美术层面上优于 png 的地方在于它本身拥有一个 alpha 通道,在 ps 或者 gimc 中处理的时候可以直接分通道处理。反过来说,如果使用的是根本没有直接进行通道处理能力的软件(比如 krita ),直接使用 png 格式进行编辑也是完全相同的,之后再做通道分离和透明度蒙版还原。
关于如何获取以上提到的可编辑图像格式,在本系列第一篇 [街霸 6 Mod 制作入门 1-解包与导出 Mod] 中已经介绍了如何用 Noesis 导出。需要补充的是,将纹理封装回游戏文件格式的时候有些许不同。因为插件使用的是注入更新源文件的方式,所以在导出时需要提供要替换的源文件的路径。如果要转换的贴图本身跟源贴图文件在同一路径并且文件名相同,这个默认路径不需要修改,否则请手动指定。指定的源文件出错的时候,会导出失败。
二、albd 贴图
albedo 贴图,也就是 diffuse 贴图,用于展示物体的固有色和材质纹理。角色模型或者可染色的游历服装因为颜色槽的存在,所以 albd 贴图大多也是黑白或者淡淡的彩色,实际颜色由 cmask 贴图决定。
如果需要透明、光泽、金属质感,都需要为贴图增加 alpha 通道并且在 MDF2 文件中进行设置。实现透明材质,需要在 MDF2 文件中设置为双面透明,同时 ATOS 纹理文件必须有红色通道和黑色背景包围;实现光泽或金属质感,需要将该部分调整为半透明。
三、nrrc 贴图
可能是 Normal, Roughness, Cavity 的缩写。
这个贴图实际的工作机制不是非常明确,在 Remy 的介绍中,它的蓝绿红通道分别对应了光泽度、凹凸、粗糙度,并且提到论坛内有人说蓝通道是 Cavity 贴图(for cavity),但是实际视觉效果更像光泽度。
但我个人更赞同 REME 的计算方式,Alpha 通道+绿通道记录法线贴图 Normal Maps,红通道记录粗糙度 Roughness,而蓝通道从视角效果是上记录凹陷度 Cavity,但是其实际是 AO 贴图。
下文以巴什模型导入 blender 后,由 RE Mesh Editor 计算得出的身体材质节点为例,对 nrrc 贴图的使用进行分析。
可以看到 nrrc 贴图节点的名字是 NormalRoughnessCavityMap,在经过一个组处理后将颜色输出给了法线贴图节点。
该组计算完整视图如下。
观察输出可以发现,首先红通道被直接连接到了 Roughness,而蓝通道进行了一个单独的输出。而传递给法线贴图节点的颜色矢量输出,则是经历了绿通道和 Alpha 通道的一系列处理获得。
获取法线贴图,对于每个像素点,有以下计算:
$$
\begin{flalign}
&设从绿通道获取到的原始值为g,从Alpha通道获取到的原始值为\alpha,g\in[0,1],\alpha\in[0,1]\
&\
&将g和\alpha线性映射至值域[-1,1],有g’=2g-1, \alpha’=2\alpha-1\
&\
&令\vec v=(x,y,z),并有\left{ \begin{aligned}
&x=\frac{g’}{|g’|}\cdot g’^2\
&y=\frac{\alpha’}{|\alpha’|}\cdot \alpha’^2\
&z=\sqrt{1-x2-y2}\
\end{aligned} \right.\
&\
&将\vec v绕z轴旋转45\degree获得\vec v’,易知绕 Z 轴旋转的旋转矩阵 Rz(θ) 为:\
&\
&Rz(θ)=\begin{bmatrix} \cos\theta & -\sin\theta & 0\ \sin\theta & \cos\theta &0\0&0&1 \end{bmatrix}
&\
&\
&则 \vec v’=\begin{bmatrix} x’ \ y’ \z’\end{bmatrix}=\begin{bmatrix} \cos\theta & -\sin\theta & 0\ \sin\theta & \cos\theta &0\0&0&1 \end{bmatrix}\begin{bmatrix} x \ y \z\end{bmatrix}=\begin{bmatrix} x\cdot\cos\theta-y\cdot\sin\theta\x\cdot\sin\theta+y\cdot\cos\theta\z\end{bmatrix}\
&\
&代入\theta=\frac{\pi}{4},有\vec v’=\begin{bmatrix} \frac{\sqrt 2}{2}(x-y)\\frac{\sqrt 2}{2}(x+y)\z\end{bmatrix}=\cdots\
&\
&\
&规格化后获得单位向量\vec e,即为该点的法线向量。\
\end{flalign}
$$
从以上计算可以看出,贴图是通过绿通道和 Alpha 通道共同计算得到,并且总是固定进行 45° 的旋转。猜测是烘焙得到普通法线贴图后,将每个像素点的向量进行了归一化计算,这样只需要其中两个维度的向量即可通过计算得到第三个维度的值,从而只用双通道就还原三维向量。
而蓝通道作为 AO 的输入,值越高 AO 的遮蔽效果越弱,因此出现强烈光泽度的原因其实是红通道提供的粗糙度不够,再加上较高的 AO 贴图值,于是出现了反光。
倒推以上计算,可以得出将普通法线贴图处理为 nrrc 贴图的工作流程:对法线贴图的像素点进行归一化、旋转(非必要)、压缩。因为涉及到大量实际代数计算,这件事情靠单纯的制图是无法完成的,所以想偷懒的你也可以选择凹凸贴图直接放入绿通道和 alpha 通道,自己顺眼即可。
最后附上关闭不同通道时游戏内实际的纹理效果,以便直观感受通道和材质的关系。
四、cmask 贴图
cmask 大概率为 Color Mask 的缩写,是用于染色的遮罩贴图。
五、atos 贴图
推测为 Alpha, Translucent, Occlusion, SSS 缩写。atos 贴图实际的效果很不明显,确定的是红通道可以用于实现透明材质,但需要同时更改 MDF2 文件,在 Alpha_Flag_Preset 枚举中将 Alpha_Flag 设置为 Double_Sided_With_Transparency。
但是根据 REME,街霸 6 的蓝通道并不用于 AO 贴图,
由于街霸 6 的标志位有问题,所以无法准确判断其作用。
并不是所有角色都有身体的 atos 贴图,而且有信息的图层完全不同,卢克和巴什的身体 atos 贴图只有蓝通道有信息,达尔西姆的身体 atos 贴图只有红通道有信息,曼侬的身体 atos 贴图只有 Alpha 通道有信息。
以卢克 c3 的头部 atos 贴图作为测试,结果如下:
仅保留红通道:
仅保留绿通道:
仅保留蓝通道:
附录
长期以来我电脑上唯一的绘图软件是 krita。作为一个画画软件它有很多优点,但对于处理 nrrc 和 cmask 这种多通道贴图来说,krita 算不上一个好选择。虽然它是一个具有浓厚 nerd 特质的开源软件,但是专注于绘画的定位又让它缺少这种偏数字化的图像处理功能。
但比起单独下一个 ps 或者 gimp 来处理贴图似乎又过于鸡肋,因此我还是试图努力探索了一下 krita 的能力。基本上它还是可以勉强用于处理多通道贴图,下面是一些操作指南和注意事项。
1. 分离通道
krita 没有办法像 gimp 那样直接在通道视图里进行编辑,而且通道预览功能本身也非常卡顿。想要进行多通道操作,就需要将所有通道拆分为普通图层。
在官方文档中,给出的工作流程指导如下:
展开查看更多
如果你要编辑单独色彩通道的灰阶数值,你必须手动分离某个图层,相关操作要在图层面板中进行。-
选择你想要进行分离的图层。
-
前往菜单栏的 图像 ‣ 分离图像通道 。
-
如下设置选项,点击 确定 :
-
来源:当前图层
-
透明度选项:透明度通道分离到单独图层
-
不要勾选:分离为彩色图层而不是灰阶
-
-
隐藏原始图层。
-
选中所有新创建的通道图层,把它们放到同一个图层组里 (图层 ‣ 图层组 ‣ 图层编组 或 Ctrl + G 快捷键)。
-
选择“红”图层,把它的混合模式改为 “复制红通道” (位于“其他”分类)。
-
选择“绿”图层,把它的混合模式改为 “复制绿通道”。
-
选择“蓝”图层,把它的混合模式改为 “复制蓝通道”。
-
确保“透明度”图层在分组的最底部。
-
在红、绿、蓝通道图层上启用“继承透明度”。
但实际上,我们不是非要在灰阶图像上进行编辑,而是根据工作习惯选择分离灰阶图或者彩色通道(使用彩色图层的时候,请同时勾选 分离后图层的活动色彩通道与当前一致
,这样 krita 会自动开启图层的单通道限制)。也不必打开 alpha 继承,因为分离出来的透明度图层也是一个灰阶图层,此时不具有 alpha 属性。
以处理卢克 c1 的 cmask 贴图 esf002_001_01_clotha_1_cmask.tex.143230113
为例,通过 noesis 导出为 tga 或 png 格式后 krita 即可直接打开。
乍一看好像没有什么内容,但是分离出透明度后,就可以看见更多信息。
选中分离出的四个图层,Ctrl+G<//kbd> 打组,取消蓝、绿、红图层的 alpha 继承,右键透明度图层,选择 转换
‣ 转换为透明度蒙版
,并将该透明度蒙版应用于整个图层组。隐藏该蒙版时就能看到剩下三个通道的所有信息,打开该蒙版就是导出后贴图应该看起来的样子。
2. 保存贴图
一般来说,当 Krita 把工程保存为图像格式时,为了提高处理效率,软件会在合并所有图层时把完全透明的区域的颜色信息丢弃并替换成黑色。这意味着,如果我们在打开透明度蒙版的时候直接导出,其他三个通道在透明区域的信息将会被丢弃。要想不丢失颜色信息,正确的导出方法是:右键点击蒙版并选择 透明度通道操作
‣ 合并保存透明度
。
特别提示,也不要通过右键蒙版并选择 透明度通道操作
‣ 作为透明度写入
的方式保存,这种方法会损失颜色信息,导致图案不完整。
3. 转通道处理
如果搞错通道,想要快速地把整个通道切换到另一个通道中,有以下两种可选的方案:
- 在通道图层上方新建空白图层,填入想要切换到的通道的颜色,使用
色相
混合模式,之后将这个图层与要修改的图层打组或者合并(否则会影响到下面的其他图层)。 - 直接对图层使用 HSV 颜色调整,按照 R-G-B 的色相分别为 0-120-240 的相对差值直接修改色相的参数值即可。例:原图层是绿色,想要改为蓝色则修改色相为 120,想要改为红色则可以修改色相为 -120 或者 240。