没错,我又来整活了。这次整活的内容是 MMD 渲染,不过严格来说是自己渲染,并不是用 MikuMikuDance 进行渲染。起因…… 就是最近看 LearnOpenGL 的模型载入的时候,意外发现 Assimp 库还可以载入 pmx 模型。于是我萌生出了大胆的想法(
如果按照模型那一节的代码,直接渲染就能得到一个还算马马虎虎的效果。模型来源:西山居艺创中心。
不过由于没有开启混合和抗锯齿,模型细节效果并不是特别好。透明的贴图显示效果不是特别完善,一些细节比如蕾丝(我很正直)并不能镂空显示。开启之后渲染效果得到了很大的改善。
不过渲染还是有点问题。通过上面的对比可以看到,在 Phong 光照下整个模型都有几乎一直的高光,有一种瓷器的质感。调试代码发现,原来模型只提供了环境光贴图。经过尝试,我发现只有完全去掉高光,只保留环境光才能渲染出正确的效果。太二次元了,,,不过渲染效果倒是相当不错。
渲染 Sour 式镜音模型效果也相当不错。模型作者:Sour 暄。
不过仔细研究发现,模型中还有很多贴图没有被载入。研究了下发现,主要是两类,一类是 sphere 贴图,另一类是 toon 贴图,然而 Assimp 并没有载入这两种贴图。而且在载入另一个模型的时候还出现了 mesh 没解析出正确材质的问题。所以没办法,我开始阅读 Assimp。
Assimp 的代码结构还是非常清晰的,看 CMakeLists 就能大致了解整个项目结构。MMD 模型载入相关的代码位于 code/MMD。阅读发现,MMDPmxParser.cpp 的 PmxMaterial::Read 明显是有加载到 sphere 和 toon 贴图的信息的。然鹅很神奇的是 MMDImporter 里并没有把这个数据转换成 Assimp 的格式,推测原因是 Assimp 的数据结构并没有能正确存储这两种贴图的方式。看来用 Assimp 是凉凉了,要么只能曲线救国,直接使用 Assimp 里面 MMD 载入的 code。不过不幸的是之前还有 mesh 贴图载入的错误,因此这段代码大概也是有 BUG 的。
没办法,只能自己想办法解析了,或者是根据现有的 Assimp 代码进行修改。于是我找到了一份 PMX2.1 的格式文档,发现 PMX 模型的细节还是相当复杂的。对于不使用纹理贴图的模型,看起来是采用正常的光照模型材质(Phong 或 Blin-Phong)。但是在使用材质的情形,又有很多不同。首先就是模型采用 Toon 贴图计算本影,使用 Sphere 贴图计算高光。Sphere 就是类似 SEM 的贴图,大部分情况下是用作高光计算,不过也有很多贴图看起来是带反射项的。另外,Sphere 贴图可以选择加或乘模式,因此也有直接当成 MatCap 使用的。推测可以在 PBR 时加以利用。
然后找到了一个看起来非常靠谱的东西:benikabocha/saba。saba 不仅是个 mmd 模型浏览器,还提供了 PMX/VMD 的文件解析。更秀的是,saba 直接实现了骨骼动画,还增加了物理运算。下一篇,就使用 saba 来加载 MMD 模型好了。
渲染应该需要台显卡 CPU 性能强劲的主机吧,挺不错
MMD 渲染是非实时渲染,渣机可以凑活用(
K 大你好,我也是二次元爱好者,我想把 saba 项目修改,让 mmd 嵌入桌面,但是我编译 saba 源代码过程中,加入模型没有 bug,加入 vmd 程序报错。你在使用的过程中有载入 vmd 吗?有没有遇到 bug,我想请教你一下。
我自己实验的 vmd 和 pmx 都是正常的,你是怎么加入的?
k 大回复好快,谢谢啦。我先将 pmx 拖到 saba 成功加载,在将 vmd 拖进去,vs2019 报错。错误信息是::0x00007FFFD523A859 处 (位于 saba_viewer.exe 中) 引发的异常: Microsoft C++ 异常: std::bad_alloc,位于内存位置 0x000000DA670FE560 处。
还有一个也是导入 VMD 遇到的问题:
File: C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.24.28314\include\vector
Line: 109
Expression: cannot seek vector iterator before begin
For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.
(Press Retry to debug the application)
saba_viewer.exe 已触发了一个断点。
不晓得问题在哪,无从下手,哈啊哈
Saba 是有自己的 API 的,看你的需求并不需要用到 saba_viewer 啊……
加载 VMD 只需要:
auto vmdAnim = std::make_unique<saba::VMDAnimation>();
vmdAnim->Create (模型);
saba::VMDFile vmdFile;
saba::ReadVMDFile (&vmdFile, 路径);
vmdAnim->Add(vmdFile);
镜头动画使用 saba::VMDCameraAnimation 就可以。具体的使用你可以看 example 下的示例,或者直接阅读 saba 的源代码。
好的,我试试,我是像先测试源程序能不能正常运行,之后再调用 api。谢谢 k 大
K 大,我又来了,我这几天学了下 opengl,返回来跳了一下,还是不行。saba_viewer 和 glfw,dx11 三个文件都不能成功加载 vmd,你可以给我你已经成功加载 pmx 和 vmd 的源文件吗?谢谢啦,想自己改源代码,无赖能力不及啊。
我的项目现在不太好拆。saba 自带的 glfw 就可以载入 vmd,而且支持人物动作 vmd & 镜头 vmd,不知是不是你没用对指令?或者是否是 saba 对部分特殊格式的 vmd 支持不全?另外,vmd 和 pmx 模型是依赖名字建立映射的,虽然一般情况下都是没有问题,但是可以试着检查 vmd 文件是否能对应 pmx。
我试了很多 vmd,都不行,而且 vmd 在其他软件里面都能和我用的模型匹配。没有修改过的 saba_viewer 就不能正常加载。能加个好友吗,想讨教一下,你不方便透露 qq 的话(我的:45***)
不是很清楚你的验证消息,建议用邮箱联系我:admin@kaaass.net。用邮箱我通常会更有时间、精力编写完整的回复。建议提供具体的错误以供分析。不过我并不是 saba 的作者,我对 saba 的了解并不是很多,更建议在 saba 的 repo 里发 issue 询问原作者。
https://github.com/assimp/assimp/tree/master/code/MMD
这个地址失效了,求更新呀。
Assimp 调整了源码结构,现在在:https://github.com/assimp/assimp/tree/master/code/AssetLib/MMD
想要遍历博主的 blog, 发现没有找到互相之间无交集的分类列表,似乎只能从 1~15 页翻着看,sad=_=
TAT,这个确实是个问题,按理来说文章分类应该是只有一个,但是我之前一直多选
请教下下一步呢,怎么加载 pmx 模型?我现在是 learnopengl.com 学的,用 assimp,是的 assimp 不会加载 spa/sph toon 纹理,但是我该使用 saba 来加载 pmx 模型呢,看各种加入 saba 等都要 vs,能否用 cmake mingw32-make 编译呢,我还不是能了解,我环境是 vscode mingw32-make,主要是就算我手动加载了 uniform sample2D… 等,但是 sph/spa toon 纹理的使用 glsl 又该怎么写?>﹏<,我再研究研究吧
啊抱歉回复晚了!可以看我的课设项目( https://github.com/kaaass/3dg_proj ),这个项目就是使用了 saba 来载入 pmx 模型,而且还实现了 MMD 人物动画(没做镜头动作)。
感谢回复!居然还有动画!我这就研究研究:D