没错,我又来整活了。这次整活的内容是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