实验笔记-番外:阴影通道与贴图叠加
岸田夏海MK2
2022年06月14日 22:41
收录于文集
共24篇

记录下捣鼓马娘改模时的简易贴图分析与处理流程,以及一些发散出的想法。

不能保证看的懂,但退一万步说,给自己留个档也是好的。


-1. 太长不看版

阴影:把辅助贴图(base)的红色通道分离出来,作为alpha通道视情况锐化后,叠加给主贴图(diff)对应的阴影贴图(shad_c)并将其应用到复制的身体材质上,从而进行后续调色。

高光:分离辅助贴图(base)的绿色通道,并作为alpha通道贴图对目标高光颜色(一般是白色)进行蒙版。

如果看到只由三原色分图层构成的混色贴图,可以思考一下会不会是张辅助贴图。


0. 前言

在之前的某个视频里,收到了@Croakfang佬的一条建议:

光影贴图?研究马娘改模时确实发现在主颜色贴图外还有些其他贴图,但当时并不知道怎么用——然后看到@LC_ilmlp把马娘的shader在unity里进行了汇编与逆向。

用解包的方式还原渲染,尊い。于是没怎么接触过unity的自己也对游戏内shader的原理以及别人家的重炮有多可爱了粗浅的理解。

结合另一篇同样高技术力的GBVS模型贴图分析/还原流程:

把unity/UE4内用算法实现的阴影贴图搬进MMD?显然不可能。

不过,啊,至少可以依葫芦画瓢的应用一下思路——也就是编辑贴图和MME。

本篇文章的几乎全部内容都将基于上述专栏中逆向出的贴图叠加方式。虽说是班门弄斧的拙劣模仿,但如果有更好的替代/改良方案,还请不吝赐教。


1. 概述&贴图整理

开始之前,先简单回顾下Cygame Tech Conference关于马娘那场中提到的“模型与贴图构成”(时间轴约8:20处):

好歌剧(CV:徳井大爷)

从上到下分别为:

Color Map - Diffuse/Shadow Color

颜色贴图 - 扩散光/阴影色

Ctrl Map - Shadow/Specular/Cut-off/Environment/Rim

控制贴图 - 阴影通道/反射光/透明通道/环境光/轮廓光

这或许也是(在模型上集齐了全部贴图类型的)好歌剧被选作这一节的讲座目标的原因吧。

关于这些贴图的具体用处与“分解方式”,同样也请移步上一节LC_ilmlp的系列专栏,里面有非常详尽的记述。

概括说来,Color Map分为基本贴图(扩散光)与阴影贴图:

左:tex_bdy1015_00_diff.png  右:tex_bdy1015_00_shad_c.png

而Ctrl Map在分离了RGB通道后可以得到具有各种功能的“通道贴图”:

左:tex_bdy1015_00_base.png  右:tex_bdy1015_00_ctrl.png

回到这边,以身体模型为例,对照一下现有的贴图:

同样是两张Color Map与两张Ctrl Map(虽然Ctrl Map只会用到那张base贴图)。头发/脸部/尾巴也各有一套,在编辑贴图时最好一并处理。

这回的范例模型是乌拉拉,毕竟另外已经在上一回出过场了。

实验开始。


2. 扩散光(Diffuse)

先从最基本的贴图开始:

和以往一样,把左边的扩散光贴图放模型上,大致凹个pose看看:

对比一下游戏里的效果:

抛开调色,还缺了点什么?

上衣拉链全黑,头发没有高光,缺少阴影,etc.

接下来就需要想个办法将这些东西逐一从辅助贴图里补到模型上。


3. 镂空/透明通道(Cut-Off)

参照第一节中的贴图分离方式,将base贴图的蓝通道分离出来:

注意:马娘(以及大部分手游)的颜色贴图尺寸为1024*1024,但这里身体模型的辅助贴图却是2048*2048,进行蒙版前请比较并调节大小。

将透明通道反色后作为alpha通道叠到颜色贴图上:

注意右图中变为透明的部分

往身体材质上应用一下新的带有镂空部分的贴图:

于是拉链不透明的问题解决了。


4. 反射光(Specular)

将头发base贴图的绿通道分离出来,就是头发的高光部分了。

将分离出的贴图作为alpha通道,蒙版到预期的高光颜色上(也就是白色):

新复制一份头发材质(复制材质,而不是直接把高光叠加到颜色贴图上的原因后面再说),并应用上述的高光贴图:

不止头发,只要是材质中“高光/反光”的部分,都会在base的绿通道上存在对应内容,在金属类材质(以及雨天专用的wet类漫反射贴图)上尤其明显。

顺带一提,“发光”类材质的发光区域与颜色,不是由base贴图绿通道,而是由关键字为“emi”(emit)的额外贴图控制——比如换皮帝宝的羽毛,波旁的LED灯,以及微光飞驹的挂饰。

高光完成,于是现在缺的只有阴影了。


5. 阴影通道(Shade)

在处理阴影贴图之前,先理解一下关于阴影颜色的应用方式。

回到之前LC_ilmlp的专栏中,第4.2章第15节“暗面贴图替换”

其中提到了:

说得再简单一点,就是把Color Map中的另一张,也就是shadow color贴图,叠加一个阴影通道后,覆盖到原贴图(diffuse)上从而形成“特定区域变暗”的状态。

以此为基准,分离出base贴图的红色通道:

反相,然后叠给shad_c贴图:

得到一张被“镂空”的阴影贴图:

脸部,头发,和尾巴同理:

然后把这一堆阴影贴图往模型上的复制材质上一套:

某些区域因为阴影贴图的叠加而变暗了,不过做到这里仍然没完。


6. 通道贴图的羽化/锐化

回头再对比一下游戏里的效果(右侧),会发现阴影是“有棱有角”的:

移步至LC_ilmlp的专栏中,第4.1章第12节“获得阴影程度”

其中提到了:

因此可以选择对贴图进行锐化。虽说无法直接照抄算式的图像处理方法,但PS里有一个类似功能,那就是“对之前分离出的通道调节对比度”,下图右侧就是将对比度设为+80的效果:

继续将其叠到shad_c贴图上,右图为改过对比度的阴影通道产生的结果:

经过通道的调节,阴影贴图的边缘比起原先的左图很明显锐利了不少。

将其用到模型上:

于是现在阴影有了相对明显的区域。


7. 阴影调节

回到上文第4节中留下的问题:为什么不把通道(base)处理过的阴影贴图(shad_c)直接叠到主贴图(diff)上,而是复制了材质后再应用贴图?

在之前的效果图中,除了衣服和膝盖两个部位以外,其他区域的阴影似乎并不明显——

那如果把阴影加深点呢?

想必不用多说什么了。阴影贴图涉及的地方其实相当多:尾巴,头发,身体,皮肤,内阴影(头发,衣服,眉毛,脖子等),甚至还有上半的眼白。

这就是阴影贴图最重要的功能:通过阴影通道/贴图的调色与覆盖,可以很容易的控制固定区域阴影的样式。无论是主界面的淡色阴影,还是Live时的深色阴影,都可以借由这种方式来完成,通过反射光(specular)贴图控制高光效果也是如此。

以上,(在MMD里用得着的那部分)马娘贴图的解析到此结束。


8. 后期处理

剩下的用勇气MME去补足!

不过需要解决的也就是toon、边缘光以及画面调色了,能看到这的同好,对于渲染的理解想必比我强了十万甚至九万倍,在此便不作详述。

最后,给阴影贴图调个色,加上和阴影颜色类似的Toon,再补个阴影锐化用的AlternativeFull,和产生边缘光的PostRimLighting——本次专栏的header图就是结果了

没法说有多好,但作为MMD而言,能提取的东西或许已经到了尽头。

她真可爱,她真迷人,她真有趣.jpg

至于回头发现之前研究过的其他游戏也有需要补充的辅助贴图,那就是后话了。


本期专栏借物&参考

头图借物

Stage:ステップライトステージ by Cyalon

MME:AlternativeFull,AutoLuminous4,Diffusion,PostRimLighting2D,XDOF

↑这也是之前视频中每次必定会用到的MME

感谢LC_ilmlp与_夏挽秋两位的shader逆向专栏,以及LC_ilmlp与Croakfang在shader/贴图通道处理上的宝贵意见与参考。

全部素材Copyright©Cygames,说实话,马娘那教科书级的素材真的让人受益匪浅。

希望以后还能有机会用上这篇的内容吧。

岸田夏海

2022/6/14