1. 为什么非要绕一圈:PMX、FBX和Unity之间的格式鸿沟
先说说我这次做事的起因。前阵子接了个Unity卡通渲染的Demo需求,美术资源用的是从MMD生态里拿来的PMX模型,具体是哪个模型不多说了,总之就是那类二次元风格、带完整骨骼和表情形态键的角色模型。一开始我的想法很简单:PMX不就带网格、带贴图、带骨骼嘛,Unity又不是吃不下带骨骼的模型,直接拖进去不就行了?
结果当然是撞了南墙。Unity对FBX、OBJ、GLTF这些通用格式支持得很顺,但PMX这种MMD专用格式,Unity原生压根不认。没有官方导入器,也没有Runtime载入的好方案,社区倒是有一些第三方PMX加载插件,但稳定性、表情支持、骨骼映射都差点意思,尤其在动画重定向和卡通渲染Shader衔接上非常别扭。所以绕一圈走Blender中转,从PMX转成FBX,是目前最可控、最通用、也最适合进Unity渲染管线的做法。
这里有个基本概念需要先厘清:PMX是MikuMikuDance的模型格式,它不只是"带贴图的模型",它还把MMD专用的材质参数(比如自发光、边缘色、地面阴影色)、表情形态键(Morph)、物理骨骼(Physics)都打包在内部。而FBX是一个通用交换格式,它把这些信息抽象成Unity能理解的那一套——网格、材质槽、骨骼层级、动画Clip。换句话说,转换不是"换个后缀",而是重新组织整套数据。Unity不认识PMX,但FBX是它的母语,Blender就是那个翻译官。
在做这个转换之前,我还特意想了一下:为什么不用Cats插件直接转换?Cats是Blender里专门处理MMD模型的一个插件,很多MMD转VRM的流程都靠它。但它有个问题,它会把模型强转成它认为的"标准结构",某些原神的模型细节、表情分组、贴图连接会被它自作主张改掉。所以我的选择是:用blender_mmd_tools做导入,手动检查结构,再用Blender原生FBX导出器输出。这套路多花一点时间,但每个环节可控,出了问题知道去哪个环节找。
工具链选择上,我建议的搭配是:
| 工具 | 版本建议 | 作用 |
|---|---|---|
| Blender | 3.6 LTS或4.x | 中转站,负责导入和导出 |
| blender_mmd_tools | 最新release | 导入PMX,保留骨骼/材质/Morph |
| Unity | 2021.3 LTS或2022.3 LTS | 最终渲染目标 |
| 卡通渲染Shader | UTS或自写Ramp/MatCap | 还原二次元风格 |
这里多说一句版本问题。Blender 4.x的FBX导出器和3.x有一些细微差异,如果你用的插件比较老,可能不兼容4.x。我这次用的是Blender 3.6 LTS,不是因为它最先进,是因为blender_mmd_tools在3.6上的表现最稳,导出FBX时对Armature的兼容性也最好。追求新版本反而容易给自己埋雷。
2. Blender侧的导入与预处理:导入只是开始,检查才是重头戏
2.1 插件安装:比想象中容易踩坑的一步
Blender装插件这件事本身不复杂,但有几个细节会影响后面导入的成败。先在Edit → Preferences → Add-ons里搜索MMD,安装blender_mmd_tools。装完之后,在File → Import菜单里就会出现MMD Model(.pmx)选项。
很多人在这一步卡住,是因为插件装上了但菜单里看不见。这里有两个坑:
- 插件没有启用——装完之后需要在插件列表里勾选Enable,只下载文件不勾选等于白装。
- Blender版本太新,插件没有被识别为兼容——有些时候插件虽然装了,但Blender版本太新,插件标记的兼容版本不含当前版本,需要在插件列表右上角勾选"Show Extensions"或者手动修改插件的blender_version属性。具体做法是找到插件的
__init__.py,把blender_version兼容项改成你当前的版本号,保存后重启Blender。
导入PMX的时候,有几个选项需要勾选:
- Scale:默认是0.08,这是MMD的单位(1单位=8cm?不,准确说是MMD默认模型高度约20单位对应现实1.6米左右,0.08是常用缩放系数)。导入时先保持默认,后面导出时统一处理。
- Use OpenGL Coordinate System:如果勾选了,模型导入后会做Y-up到Z-up的转换,建议不勾选,让Blender按自己的Z-up坐标系处理,后面导出FBX时统一转换更干净。
我导入之后做的第一件事不是看模型,而是检查骨骼层级的完整性。原神的PMX模型骨骼一般分两类:一种是做MMD舞蹈用的标准骨骼(大部分是日语命名),另一种是带物理骨骼的完整骨骼链。如果导入后发现骨骼只剩一层、子级散落,那多半是插件选项没开对,重新导入一次,勾选上Import Bones的所有子选项。
2.2 材质球检查:卡通渲染的第一步在这里决定
把PMX导入Blender之后,材质这一块是最需要手动干预的环节。PMX的材质在Blender里会以Principled BSDF节点为基础自动转换,但MMD里的一些特殊参数,比如边缘色、发光色、阴影色,会被折叠成Blender的简易节点,信息会丢失一部分。
我的习惯是导入后逐个材质球点开看节点树。重点看这几项:
- 贴图路径是否指向正确。这是最常出问题的地方。PMX的贴图路径是相对MMD模型的目录存储的,如果PMX和贴图不在一个文件夹里,导入后贴图会丢失,模型会变成灰模。
- 透明材质设置是否正确。头发、刘海、半透明裙摆这些材质,MMD里用的是Alpha混合,导入后Blender的Blend Mode要手动设置成Alpha Blend或Alpha Hashed,不然渲染出来会有黑边。
- 双面着色。卡通模型的脸部翻转面、头发内侧,都需要勾选双面显示,否则转成FBX进Unity后从背面看会"漏肉"。
| 材质部位 | MMD中的设定 | Blender需要做的处理 | 进Unity后的预期 |
|---|---|---|---|
| 皮肤 | 无特殊,通常不透明 | 默认Principled即可 | 阴影柔和,接受Ramp光照 |
| 头发 | 常带环境吸收色/边缘光 | 确认贴图连接正常,必要时补Roughness贴图 | 高光不宜过强,要有卡通分层感 |
| 眼睛 | 眼睛高光独立贴图,透明 | Alpha Blend开启,确认透明面朝向正确 | 眼睛贴图不发黑,高光锐利 |
| 裙子/布料 | 背面可见,双面渲染 | 勾选双面,必要时增加厚度 | 透光效果符合二次元习惯 |
一个常见的坑:Bledner里看着材质正常,导出FBX进Unity后,贴图全丢或者错位。这个问题的根源通常不是Blender,而是FBX的贴图嵌入方式和Unity导入器的设置。后面第4节会专门讲,这里提前做个预防性提示:在Blender里把贴图文件整理到统一的一个textures目录里,导出时选择Copy模式嵌入贴图,能省掉后面80%的贴图丢失问题。
2.3 骨骼与姿态:T-Pose不处理好,后面动画全歪
PMX模型导入Blender后,一般会保持在MMD的T-Pose(实际上更接近A-Pose,手部有点微张),这是正常的。但要注意,原神的模型骨骼提取后有时会带一个默认姿态帧,这个姿态可能不是T-Pose,而是一个稍微有点奇怪的站姿。如果带着这个姿态直接导出FBX,Unity里绑定Humanoid时可能识别不了骨骼,或者识别出来的Avatar是歪的。
我的处理方法是:导入后,选中Armature,进入Pose Mode,全选骨骼,然后用Clear Pose Transform(Alt+R,Alt+G,Alt+S)把姿态归零。这一步能把骨架恢复到编辑模式下的绑定姿态,也就是最干净的T-Pose。但要注意,不要在编辑模式下乱动骨骼位置,骨骼的相对位置是模型绑定时确定的,动了之后蒙皮权重就飞了。
另外一个必须提前检查的是骨骼命名。Unity Humanoid Avatar的自动映射依赖骨骼名称,如果模型的骨骼不是标准命名(比如Mixed/日语命名),自动映射会失败。blender_mmd_tools导入时一般会保留日文或英文名称,如果发现骨骼名不是Hips、Spine、Chest、Head、LeftArm这类Unity标准名,可以在导入后手动批量改名。实际上原神模型提取得比较完整的话,骨骼名大概率已经是英文标准命名了,但以防万一,我每次都会在Blender里用脚本查一遍关键骨骼名称。
查骨骼名的小脚本,我放在Blender的Scripting工作区里跑的:
import bpy armature = bpy.context.object if armature and armature.type == 'ARMATURE': names = [bone.name for bone in armature.data.bones] required = ['Hips', 'Spine', 'Chest', 'Head', 'LeftArm', 'RightArm', 'LeftLeg', 'RightLeg'] missing = [name for name in required if name not in names] print("Missing bones:", missing if missing else "None")如果missing返回空,说明Humanoid映射大概率没问题;如果有缺失,得把对应骨骼重命名补上再把骨架的Root节点指向Hips。
3. FBX导出的关键设置:参数错一个,Unity里全盘崩
3.1 缩放与世界坐标:最容易出问题的地方
先说结论:Blender导出FBX时,最核心的三个设置是Scale、Apply Scalings、Forward/Up坐标轴。这三个参数相互关联,牵一发动全身。
我推荐的导出参数组合是:
Export Format: FBX 7.4 Binary Scale: 1.00 Apply Scalings: FBX All Forward: -Z Up: Y Apply Unit: 勾选 Apply Transform: 勾选为什么是Forward: -Z, Up: Y?因为Unity是左手坐标系,Y轴朝上,Z轴朝向屏幕里(也就是模型正面朝向-Z)。Blender的默认坐标系是Z轴朝上,Y轴朝向屏幕里。如果导出时不做坐标转换,进了Unity模型会躺倒,或者正面朝向不对。
我踩过一次坑是:觉得Apply Transform这个选项"应该勾",结果勾了之后,模型的旋转虽然归零了,但骨骼的朝向全乱了,动画进Unity后膝盖反折。后来才明白,Apply Transform适合静态网格,对带骨骼的模型要谨慎。最稳的做法是:在Blender里先选中Armature和Mesh,Ctrl+A → Apply Rotation & Scale,把模型的变换应用掉,然后导出时Apply Transform保持默认(或按你的插件版本决定),不要重复应用导致骨骼变形。
Scale这块的坑更隐蔽。MMD模型导入时默认Scale是0.08,如果在Blender里不改,模型高度大概0.2Blender单位(因为MMD模型的1单位等于现实8cm,原神角色身高约1.6米,导入后就是0.2单位)。导出FBX时,如果Apply Scalings选择FBX All,会把0.2单位放大到1.6米(乘以8),进Unity后Scale Factor会变成1,模型就是正常真实大小。如果选择FBX Units Scale或者None,Unity里可能得出一个0.2米的模型,需要手动改Scale Factor。
所以每次导出前我都要做一道算术题来确定Unity那边的最终缩放的:
[ UnityScaleFactor = \frac{模型在Blender中的世界空间高度(m)}{目标Unity高度(m)} ]
一个角色模型,在Blender里看到的高度大约是0.22单位,目标Unity高度是1.6米,那Unity的Scale Factor就是0.22/1.6≈0.1375。记下这个数,导入Unity后填在FBX导入器的Scale Factor里。
3.2 骨骼与动画的导出取舍:不该带的千万别带
FBX导出面板里的Armature选项,决定了骨骼的导出方式。对于卡通渲染角色,我建议选择Armature + Skinned Mesh,也就是把骨骼和蒙皮网格一起导出。下面是几种情况的分析:
- 只导出Mesh不导骨骼:进Unity后模型是静态的,不能做动画,不能换Avatar,基本废了。
- Mesh + Armature但没勾
Add Leaf Bones:骨骼链条会不完整,Unity的Humanoid映射链条断在末梢。 - 把所有辅助骨骼、IK目标骨骼全导出去:骨骼数量爆炸,Unity里Avatar配置也复杂了。
这里有个操作细节,原神PMX模型的附带物理骨骼(如裙摆物理)建议导出时选择性屏蔽。PMX的物理骨骼是通过MMD的物理引擎计算的,Blender里没有对应的物理引擎,导入时这些骨骼会变成普通骨骼存在。如果全部导出,Unity里它们没有任何物理行为,但是会占用骨骼数量,影响Avatar映射的准确性。我通常是把这些物理骨骼层放到一个单独的骨骼层里,导出时只导出我们需要的骨架层。
顺便说一个很多教程不爱讲的操作:导出前把模型摆成一个"干净的T-Pose"。不是只归零姿态,而是确认手臂和身体之间有足够的间距,不要让手臂贴住躯干。太贴的话,蒙皮权重在导出-导入过程中可能转移,进Unity后抬手时手臂会带出一块躯干的面。T-Pose不要求绝对标准,但至少手臂和躯干之间有一个拳头的距离。
贴图嵌入方面,FBX导出时会在Path Mode里选择贴图路径处理方式。我推荐选择Copy,这样导出时会生成一个贴图副本目录,FBX里记录绝对路径或相对路径都能找到贴图。选Reference的话,如果之后移动了贴图文件夹,Unity导入时就找不到贴图了。这里宁可多占一点存储,也不要让材质丢贴图。
3.3 一个容易被忽略的检查:法线与平滑组
卡通渲染对法线方向极其敏感。原神的模型面数不高,但它的法线经过优化,边缘较硬的部分(比如头发、裙褶)有明显棱角感。从Blender导出FBX时,法线会原样保留,但要检查模型是否有翻转法线的面。Blender导入PMX后,有些面会因为坐标转换出现法线反转,表现是模型上有黑色的斑块。
检查方式:Blender的Viewport Overlays里勾选Face Orientation,面朝上的会显示蓝色,反的会显示红色。如果发现异常面,进入Edit Mode选中它们,Mesh → Normals → Flip,修正后再导出。
平滑组(Smoothing Group)在FBX里也有讲究。Blender的FBX导出器默认会把"角度大于30度的相邻面自动生成硬边"这个逻辑导出去。但卡通模型恰恰不需要过多硬边,否则渲染时光影梯度会很碎。如果你导出后发现Unity里模型看起来"棱角分明"得过分,多半是这个选项导致的。解决办法是:导出前选中网格,Mesh → Shade Smooth(全部平滑),FBX导出器的Smoothing选择Normals Only,这样它是守着法线导出的,不会自作主张重算。
4. Unity端导入与卡通渲染衔接:模型进来了不等于渲染能看
4.1 FBX导入器的关键设置
FBX拖进Unity Project窗口后,需要检查两个地方:Model面板和Rig面板。
Model面板里,最关键的是Scale Factor,就是我们上面计算出来的那个数。如果导入时发现模型大小不对,先别急着改Transform的Scale,应该改这里。Scale Factor设正确后,Transform里的Scale应该是(1,1,1),这样后续做动画、加组件、做物理都不会被"非均匀缩放"坑到。
Read/Write Enable这个选项要开启。不开的话,运行期间如果脚本要读取网格数据(比如做Mesh合并、描边抽取轮廓),会报错。卡通渲染经常要做后处理或者Mesh操作,这个勾选是必须的。
Legacy Blend Shape Normals不用管,保持默认。
Rig面板里,把Animation Type设成Humanoid,然后点Configure进Avatar配置界面。如果前面骨骼命名检查做得好,这里自动映射基本一次成功。有几个容易误映射的骨骼需要手动确认:Shoulder(肩膀)偶尔会被映射到锁骨附近的骨骼,Upper Chest(上胸部)在有项链骨骼的模型上可能识别错。确认无误后Apply。
这里提一个大多数新手会忽略的:**导入的模型带不带原本的材质?**FBX导出时如果材质球的节点树不太干净,进Unity后每个材质槽可能会生成一个默认的Standard Shader材质球,但不是我们想要的卡通渲染效果。这时候的应对策略是后面讲的通用做法——忽略FBX自带的材质,直接按名字匹配到我们自己的材质库。
4.2 恢复二次元质感:卡通Shader的衔接与材质重映射
原神的卡通渲染在业内算是很有代表性的,它的核心构成可以拆成三块:Ramp光影(受光面与背光面的色阶过渡)、MatCap/高光点缀(模拟皮肤和头发的材质感)、描边(外轮廓与内部结构线)。FBX导入后自带的是Standard Shader,是PBR物理渲染,完全不沾二次元的边,必须换成专门的卡通Shader。
我之前用的有两个方案:
方案一:用Unity Toon Shader(UTS)这是日本开发者开源的方案,对MMD转过来的模型兼容性极好。UTS提供三个颜色通道(Base Color、1st Shade Color、2nd Shade Color),配合Ramp贴图能做出原神那种两段式/三段式的光影过渡。皮肤、头发、衣服分开调。
方案二:自己写Ramp + MatCap采样如果不想依赖第三方Shader,可以写一个Unlit风格的Shader,用主贴图加上一张Ramp贴图(横向从左到右是暗部到亮部),通过NdotL(法线点积光照方向)采样Ramp的横坐标,颜色的渐变就会呈阶梯状,二次元感就出来了。配合边缘光Fresnel项再叠加一层,效果不输UTS。
不管用哪个方案,材质重映射的思路都是一样的:按FBX导入后生成的材质名字,去匹配我们预先准备好的卡通材质库。写个编辑器脚本遍历导入的FBX子物体,把MeshRenderer或SkinnedMeshRenderer上的材质换成对应名字的卡通材质,就能一键完成替换。
using UnityEditor; using UnityEngine; public class MaterialMapper : EditorWindow { public Material targetMaterial; [MenuItem("Tools/Material Mapper/Map Selected")] static void MapMaterials() { foreach (var go in Selection.gameObjects) { var renderers = go.GetComponentsInChildren<SkinnedMeshRenderer>(); foreach (var renderer in renderers) { var mats = renderer.sharedMaterials; for (int i = 0; i < mats.Length; i++) { // 按名称模糊匹配,原神的材质通常是"Body"、"Face"、"Hair"等命名 if (mats[i] != null && mats[i].name.Contains("Body")) mats[i] = AssetDatabase.LoadAssetAtPath<Material>("Assets/Materials/Cartoon_Body.mat"); // 其余槽位同理,可根据实际需要扩展规则 } renderer.sharedMaterials = mats; } } } }这个脚本本质是做个演示,实际项目中替换规则会更复杂,比如一个角色可能有几十个材质槽,不同部件精度不同,这时候最好维护一个模型名称 → 材质映射表的配置文件,把替换规则外置,省得每次改代码。
4.3 阴影、描边与后处理:让画面"活"起来
模型换好卡通Shader只是第一步,原神那种整体画面质感还需要配合灯光、阴影和后处理。
先说阴影问题。UTS里在Step Offset和Feather里调阴影边缘硬度,数值越小,阴影过渡越锐利,二次元的"切边阴影"感越强。但有个大坑是Unity的Shadow Cascades如果开太高,阴影边缘会被虚化,卡通感就没了。我实测下来,方向光的Shadow Type设为Hard Shadows,加上小范围Cascade(2 Cascades),在PC上基本能得到接近原神PC版的阴影效果。
再说描边。原神模型中,外轮廓线是通过反转法线制作的背壳模型(Inverted Hull)实现的,但PMX转FBX后,这个背壳模型不会自动生成,需要自己处理。有两种做法:
- 在Unity里用Shader做轮廓:顶点法线方向挤出一定厚度,背面渲染,用纯色或带渐变色的描边。优点是简单高效,缺点是头发等小平面的挤出效果可能不理想。
- 在Blender里先做好背壳模型:把原模型法线翻转,往外扩大一圈,材质换成一个纯色描边材质,随FBX一起导出进Unity。这是最还原原神做法的路径,但要处理好顶点焊接和贴图缩放的对应关系。
我个人的体感是:外轮廓用Shader挤出(方案1),内部细节线(比如衣服褶皱、发丝分界)用贴图自带结构线来表现,两者结合效果更好。纯粹靠物理轮廓会显得"塑料感"太重。
后处理这一层,主要是Bloom和色彩分级。原神在PC端的画面有轻微的泛光和柔和的色彩对比,可以在Unity的Post Processing Stack里加一个Bloom,Intensity调低(0.3左右),再加一个Color Adjustments把饱和度略微拉高一点。这样整体画面质感会贴近原游戏,又不至于糊成一片。
5. 全流程实测:踩过最深的几个坑和排查链路
5.1 模型导入Unity后黑得看不清:排查出来的三个原因
走完全流程后,我第一次把模型拖进场景里,发现模型几乎是全黑的,灯光打在脸上只能看到轮廓。这个问题的排查过程比较典型,我把链路写出来供参考。
第一步,先排除灯光问题。我把场景里的平行光强度拉高,方向对准模型正面,发现脸部还是黑的,但是背部高光正常。这说明背面法线有反转,光照方向反了。
第二步,去Blender里复查法线。用Face Orientation检查,发现整个模型的面朝向和我想象的相反。顺手把所有面的法线统一翻转(Mesh → Normals → Recalculate Outside),再导出一次到Unity,问题解决。
类似的黑面问题还有几种可能,一并列出来:
- 材质球里的Albedo贴图Alpha值太低,模型整体半透明变暗。
- 平行光没有启用Shadow,卡通Shader里的阴影色块覆盖了整个模型。
- 模型的Scale是负数(某个轴翻转了),导致法线方向全局反转。
排查原则就一条:先看网格数据对不对,再看材质通道正不正常,最后才动灯光。
5.2 骨骼错位:Humanoid映射成功但动画播放时模型"拧成麻花"
有一次我导入后Avatar映射非常顺利,但播放Unity自带动画时,模型的胳膊和腿像橡皮糖一样扭来扭去。查了半天,最后发现是Blender导出时,我为了图省事勾了Apply Transform,导致骨骼在FBX里的旋转值被"烘焙"成了全局旋转,Unity的Humanoid解析时把模型的T-Pose理解成了错误姿势,一做动画就全崩了。
这个问题的修复方法是:
- 回到Blender,选中Armature,Pose Mode里把姿态归零(前面提过的Clear Pose Transform)。
- 在Object Mode里选中Mesh和Armature,Ctrl+A → Apply Rotation & Scale。
- 导出FBX时不勾
Apply Transform。
这样导出的FBX骨骼旋转是局部的干净值,Unity识别起来没歧义。
5.3 表情(Blend Shape)在Unity里不生效或错乱
PMX的表情形态键在导入Blender后,会转化成Blender的Shape Key(形态键),导出FBX时,只要勾选了Apply Modifiers(或者相应的Shape Keys选项),就能带进Unity的Blend Shape里。
但这里有个原神模型特有的坑:原神的眼睛、眉毛、嘴巴表情,很多是通过贴图切换实现的,不是几何变形。也就是说模型的网格没有变化,只是换了一张脸的贴图。这种表情在PMX里叫"Tex Morph"或者"Material Morph",转换成FBX后,Unity的Blend Shape不支持这种"基于贴图的形态",表情自然就不动了。
处理方案有两条路:
- 如果是骨骼动画驱动的表情(比如眨眼通过上眼皮骨骼转动),那没问题,骨骼导出后Unity能识别。
- 如果是贴图切换表情,就得把每个表情单独做一张纹理图集,在Unity里通过脚本动态切换材质的主贴图来模拟。
实际操作时,我通常是在Unity里写一个表情管理器,把一个角色的所有表情贴图打包成图集,通过一个0到1的Float参数控制混合,这样实现的表情切换比Blend Shape更扣细节,卡通角色的表情表现力反而更强。
5.4 破面与穿模:T-Pose导出前的最后一道检查
最后说一个材质之外的问题:模型的破面。原神模型的裙摆、头发末端有很多小碎片,Blender里看着正常,导出FBX后某些小面片会消失或者反转。这个问题的根源通常是相邻面的法线索引在转换时发生了错误,或者网格有非流形边。
排查办法是在Blender里进入Edit Mode,选择Mesh → Clean Up → Degenerate Dissolve,把退化的面片清理掉,然后Mesh → Normals → Recalculate Outside。如果还是出现破面,检查模型的Scale是否应用了,因为非均匀缩放会导致某些面上的点重合,看起来像破面。
6. 最后的心得:这套流程的适用范围和进一步扩展
做完这个流程之后,我其实还想了很多。PMX转FBX,本质上解决的是一个格式壁垒的问题。原神模型只是PMX生态中的一个例子,MMD模型库里有大量优质的二次元角色模型,只要掌握了这套转换逻辑,从Blender到Unity的通路就打开了。你可以在Unity里做动作演出、做游戏Demo、做VRChat类似的社交虚拟形象、甚至把转换后的模型接到AI动作驱动上做实时动画。
但我必须提醒一句:如果是用别人提取的游戏模型,务必注意版权边界。个人学习、技术验证没问题,但商用和公开发布前,必须确认模型的授权条款。这是一个经验丰富的从业者必须有的基本素养。
关于卡通渲染的思路,多说两句。很多人觉得卡通渲染就是把Shader换成UTS就完事了,其实真正的质感差在细节:阴影色阶的过渡曲线、高光的形状、描边的粗细变化、后处理的泛光强度。这些东西没有统一的"正确答案",跟模型的贴图风格、场景的光照设计都有关。我建议拿到一个模型后,先在Maya或Blender里用它的原始材质观察一遍光影关系,再在Unity里调Shader参数,这样不至于凭感觉乱调。
从PMX到FBX这个转换链路,我目前的设计是:blender_mmd_tools导入 → 法线/材质/骨骼检查 → 导出时精调坐标与Scale → Unity导入器配置 → 材质重映射 → 卡通Shader细化。每一步都有它的逻辑,每一步都能单独展开讲很多。如果后面有机会,我还想再写一篇关于"原神风格卡通Shader参数调优"的文章,把Ramp贴图绘制、MatCap采样、描边Shader的挤出逻辑这些细节掰开揉碎讲清楚。
那这次就先分享到这里,希望这条全流程对正在被PMX模型折磨的你有点帮助。