MMD笔记上瘾篇(上):渲染流程,模型,PBR材质
呵来
编辑于 2023年12月04日 11:06
收录于文集
共5篇

是时候摆脱拖延症整理一下做MMD的一般流程了,加载东西一多就容易丢三落四的up也确实需要一张cheatsheet。如果能帮到你那自然更好!


1. 渲染流程概要

一直很想在MMD里实现在保持卡通风格的前提下拥有柔和渐变偏真实光影的2.5D效果,为了保证后者,PBR似乎不可或缺,在这个前提下利用M4Layer分层叠加NPR是能想到的比较直观快捷的方法。其他MME也大都可以看作是一般叠加模式的图层,所以渲染主体流程就变成了决定每一层放什么以及怎么叠加的问题。太长不看:

其中步骤3-6是PBR之外额外叠加的NPR元素,NPR基础色用来调整PBR材质基础色,边缘光和阴影是让PBR光照更偏向Toon的局部微调。为了限制篇幅就先碎碎念一下步骤1-2部分吧,其他的之后补上。PBR渲染方面,主要是以sdPBR为主,也会涉及一些sdPBR和ray渲的横向比较。

2. 模型

个人感觉导入MMD前对模型适度修改对最终效果影响很大,可以算是一轮预渲染。

2.1 简化阴影

不同模型需要进行不同程度的法线平面化来达到卡通表现需要的简化阴影,比如崩坏角色模型面部一般需要比原神角色模型面部更强的法线平面化,up的偏好前者一般在40%-50%而后者一般在35%-40%(Faceforward插件)。

2.2 高光添加

主要是面部的高光材质添加。这可能是比较作弊的方法,不过目前还没有找到能够在叠加层中快捷地添加令人满意的软边缘卡通高光的方式(高光贴图理论上可行,但比较费时),所以暂且用着:在卡通渲染高光特征区(e.g. 鼻尖、唇部等)额外增加一层形状为所需高光形状的材质(为了和皮肤颜色过渡自然设为带羽化的半透明),适当调高反射强度并/或增加随视角变化较为明显的sph贴图,这样能一定程度模仿在特定角度下出现面部高光的近似Toon渲效果。

2.3 特殊材质分离/添加

用得比较多的是金属、自发光材质的分离,同时根据视频预计的光照情况调整sph和反射强度:光源较少环境较暗的时候只需较低的反射强度就能有突出的发光效果,而多光源或者白昼环境就需要考虑有强调效果的同时不会过曝,甚至在变化比较大的情况下需要增加表情进行调整。除了材质分离,也有个别情况下会额外复制一层材质用于一些MME比如Lightmap【1】的特殊表现。

3. PBR材质

3.1 PBR材质参数

主渲选择基于物理主要是为了材质能和变化光照自然交互,并让人物模型和环境融和得更平滑,实际操作上为了更接近Toon渲基本会把光滑度、金属度和反光调得比较低,所以对反射和漫反射效果没做太多考察。这次借机熟悉了一下sdPBR的材质参数:

sdPBR主要参考了经典的Disney Principled BRDF【2】,材质参数与效果也大致与其一致,除basecolor外的其他参数值从0到1的效果变化见下图,附综合Principled BRDF、sdPBR【3】、ray-mmd【4,5】的参数描述及翻译,sdPBR视角为主。

Disney Principled BRDF参数效果一览【2】

1) baseColor: 基础色,ray中对应Albedo。材质金属度为1时与镜面反射率有关,金属度为0时与漫反射率有关。可通过BASECOLOR_FROM使用贴图(ray:ALBEDO_MAP_FROM)

  • gamma:sRGB转换为线性RGB的系数,sdPBR(shader/sdPBRcommon.fxsub)和ray(Shader/math.fxsub)中默认值均设为2.2,均能通过相应的ColorGrading控制器进行调节。另外sdPBR能在材质层面对BASECOLOR_GAMMA和SUBCOLOR_GAMMA进行自定义。

  • subColor:亚反照率,ray中对应SubAlbedo。可通过SUBCOLOR_FROM使用贴图(ray:ALBEDO_SUB_MAP_FROM)

2) metallic:金属度,ray中对应Metalness。为了避免在特定光照下的不自然表现一般设为0或1,避免使用中间值。可通过METALLIC_FROM使用贴图(ray:METALNESS_MAP_FROM)。

3) roughness:粗糙度,ray中对应Smoothness(=1-roughness^0.5非线性粗糙度;=1-roughness 线性粗糙度)。影响直接光产生的高光锐利程度(sdPBR和ray),也会影响环境贴图的反射细节(仅sdPBR)。可通过ROUGHNESS_FROM使用贴图(ray:SMOOTHNESS_MAP_FROM)。

  • subroughness:sdPBR独有,可通过SUBROUGHNESS_FROM使用贴图。

4) anisotropic:各向异性镜面高光的纵横比,ray中对应Anisotropy(CUSTOM_ENABLE 3)。可通过ANISOTROPIC_FROM使用贴图(ray: CUSTOM_A_MAP_FROM 各向异性程度, CUSTOM_B_MAP_FROM切线扰动)

  • anisoAngleX/Y:sdPBR独有,从两个互相垂直方向旋转奇点在切空间中的位置,1为旋转一周。可通过ANISOANGLE_X_FROM和ANISOANGLE_Y_FROM使用贴图。

上衣anisotropic材质。左:anisoAngleX=0;右:anisoAngleX=0.4.

5) clearcoat:清漆,表现为物体表面被一薄层折射率1.5的材料覆盖的状态。ray中对应Clear Coat(CUSTOM_ENABLE 6)。可通过CLEARCOAT_FROM使用贴图(ray: CUSTOM_A_MAP_FROM 光滑度)

6) clearcoatGloss:sdPBR独有,清漆光泽度,大约对应1-roughness。可通过CLEARCOAT_GLOSS_FROM使用贴图。

以下参数7-11在sdPBR中仅metallic=0(非金属材质)时生效;在ray中,8仅在metallic=0生效,其他情况未知:

7) subsurface:次表面散射程度。ray中对应Subsurface Curvature?(CUSTOM_ENABLE 7,CustomA)。0为无散射,越接近1则次表面散射越多。可通过SUBSURFACE_FROM使用贴图(ray: CUSTOM_A_MAP_FROM,曲率/不透明度)。

  • sssColor:SSS系数(diffusion profile的粗略近似),散射较强区域所接近的颜色。似乎目前除了pre-integrated skin类材质外没有明显效果。可能对应ray中的Transmittance color散射色?Ray可通过CUSTOM_B_MAP_FROM使用贴图。

8) specular:非金属物质的镜面反射率,设为0则正面镜面反射率为0,1则对应正面镜面反射率8%。Ray中对应Specular(SPECULAR_MAP_TYPE 0/2)。sdPBR与ray均默认大部分非金属材质的镜面反射率为0.5。sdPBR中可以从折射率推算镜面反射率(IORtoSpecular)

9) specularTint:sdPBR独有,非金属物质镜面色调向基础色的倾向。设为0时靠近表面切线方向的镜面反射不被着色。若为金属材质,则镜面反射色为基础色baseColor。

10) sheen:光泽度,主要用于织物、头发等非金属材质。Ray中对应Cloth Sheen(CUSTOM_ENABLE 5, CustomA)。sdPBR无法使用贴图(ray:CUSTOM_A_MAP_FROM)

11) sheenTint:sdPBR独有,非金属物质光泽度向基础色的倾向。设为0时光泽为白色(光源色)无视基础色。接近表面切线方向的镜面反射无论该参数值均不会着色。sdPBR无法使用贴图。

  • Fuzz Color:ray独有,绒毛颜色,sRGB空间中fresnel的f0。ray可通过CUSTOM_B_MAP_FROM使用贴图。可能可以看作sheenTint(限定basecolor)的拓展(任意颜色)?

以下参数12-17为sdPBR扩充参数。

12) smoothShade:sdPBR独有,平滑着色,仅在点光源或平行光源照射时生效。通过匹配光源方向和法线方向来创建环绕照明氛围,half-Lambert光照模型是其中一例。这个参数在可以在sdPBR控制器中进行全局调整,也可以分材质进行自定义。个人感觉这个参数用于调整补光和消除面部过度反光有奇效。

过亮点光源照射下的皮肤平滑着色表现。左:smoothShade=0;右:smoothShade=1。

13) emissiveColor:自发光,ray中对应Emissive。sdPBR中是在着色完成后的亮度值额外加算项,可取大于1的值(线性颜色空间)。可通过EMISSIVE_FROM使用贴图(ray:EMISSIVE_MAP_FROM)。

14) toon:计算直接光时二分阴影程度。ray中对应ToonBased Shading hardness(CUSTOM_ENABLE 9, CustomA)。设为1时界线最为分明。sdPBR无法使用贴图(ray: CUSTOM_A_MAP_FROM 阴影边界硬度,CUSTOM_B_MAP_FROM 阴影色)。

左:toon=0;右:toon=1。

15) mofu:sdPBR独有,绒毛。适用于mofu_mofu扩充着色模型。不能与height同时定义。可通过MOFU_FROM使用贴图。

16) iridescence:sdPBR独有,虹彩结构色强度。适用于iridescence扩充着色模型。可通过IRIDESCENCE_FROM使用贴图。

左:iridescence=0;右:iridescence=1,iridescenceMode=0,iridescenceD=0.3。(反射天空盒图案是因roughness参数较小,与iridescence无关)

  • iridescenceMode:sdPBR独有,虹彩结构色模式。目前有0、1、2三种模式分别对应以下三张查找表【3】,分别模拟油或皂液薄膜表面、甲虫外壳和孔雀羽毛。

sdPBR iridescence lookup table

左:iridescenceMode=1,iridescenceD=0.3;右:iridescenceMode=2,iridescenceD=0.3。

  • iridescenceD:sdPBR独有,虹彩膜厚度,对应查找表的y轴。值为0时从最上方,值为1时从最下方进行颜色采样。查找表的x轴为光源向量L和半程向量H的点乘。

左:iridescenceMode=1,iridescenceD=0.3;右:iridescenceMode=1,iridescenceD=0.6。

17) porouscoat:sdPBR独有,用于指定多孔材料图层的厚度。适用于cosmetics扩充着色模型。可通过POROUSCOAT_FROM使用贴图。

以下为其他材质参数补全。

18) normal:法线。ray中对应Normal。可通过NORMAL_FROM使用贴图(ray:NORMAL_MAP_FROM)。

  • subnormal:子法线。ray中对应SubNormal。可通过SUBNORMAL_FROM使用贴图(ray:NORMAL_SUB_MAP_FROM)。

19) mask:透明度。ray中对应Alpha。可通过MASK_FROM使用贴图(ray:ALPHA_MAP_FROM)。

20) height:高度。ray中对应Parallax。可通过HEIGHT_FROM使用贴图(ray:PARALLAX_MAP_FROM)。

21) ao:环境光遮蔽。ray中对应Occlusion。可通过AO_FROM使用贴图(ray:OCCLUSION_MAP_FROM)。

还有一些很好玩、应用场景也很广泛的材质比如animation texture和procedural texture因为还没怎么试用过就先略过。

3.2 sdPBR与ray-mmd材质参数比较总结

综合以上,不难看出sdPBR和ray-mmd的材质参数都能胜任大部分mmd材质需求,只是在参数是否为特殊着色模型专用、是否能应用贴图上有些微区别。它们也分别有各自独有的专用着色模型用于特殊材质。对于sdPBR,玻璃材质折射率参数的缺失是一个遗憾,例如[A]ddiction场景中Tex_19的折射率贴图目前无用武之地。不过sdPBR似乎有向BSDF模型【6】拓展的尝试,期待在这方面的补足。说起BSDF,虽然不在MMD但似乎可以迁移MMD项目的AnimatorGo【7】,最近好奇翻了一下Rui大的Github才看到的项目,不知是否有大佬尝试过效果如何?

3.3 sdPBR材质贴图批量导入

关于[A]ddiction场景sdPBR材质的生成,其实用了些偷懒的方法,主要利用了sdPBR自带的材质贴图导入工具MaterialImporter能够自动识别ambientCG.com中的贴图名称关键词这一点,比如带有“_Color.png”后缀的是baseColor贴图,“_AmbientOcclusion.png”是ao贴图等。实际操作上,借助命令行将原场景贴图文件夹内的各个材质批量重命名为ambientCG.com贴图名称格式并分材质压缩,之后只要将它们丢进MaterialImporter就能快速生成所有材质的sdPBR材质文件。在此基础上对一些无法被识别的参数(如Emissive)进行微调就可大致成型,这次同样因为嫌麻烦只是粗暴地指定了Emissive参数值,对于复杂一些的材质其实应该指定贴图才是。另外需要注意的一点是通过MaterialImporter生成的材质最多只能接受8个通道的参数值(两张rgba通道图),超过这个数量的材质贴图会被无视,需要在材质文件中手动添加。


呼,好像叨叨得有点多,感谢看到这里~如有错漏还请指正!

参考文献/资源:

【1】MengLu. “LightMap LightDIY” https://bowlroll.net/file/162269.

【2】Burley, Brent, and Walt Disney Animation Studios. "Physically-based shading at disney." Acm Siggraph. Vol. 2012. vol. 2012, 2012.

【3】SANDMAN. “マテリアル説明 基本編”.

【4】Rui. “ray-mmd Wiki: Materials” https://github.com/ray-cast/ray-mmd/wiki/Materials.

【5】GAJ. “ray-mmd 日本語ドキュメント: 8-2.マテリアル パラメータ” https://github.com/gaj-cg/ray-mmd-docs-ja/wiki.

【6】Burley, Brent. "Extending the Disney BRDF to a BSDF with integrated subsurface scattering." SIGGRAPH Course: Physically Based Shading in Theory and Practice. ACM, New York, NY 19.7 (2015): 9.

【7】Rui. “AnimatorGo” https://github.com/ray-cast/AnimatorGo.