MMD渲染整活笔记(一)

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

分享到

KAAAsS

喜欢二次元的程序员,喜欢发发教程,或者偶尔开坑。(←然而并不打算填)

相关日志

  1. 没有图片
  2. 没有图片
  3. 没有图片
  4. 没有图片

评论

  1. Mr.Chou 2020.02.23 7:05下午

    渲染应该需要台显卡CPU性能强劲的主机吧,挺不错

    • KAAAsS 2020.02.23 9:08下午

      MMD渲染是非实时渲染,渣机可以凑活用(

  2. WLJ 2020.03.17 11:37上午

    K大你好,我也是二次元爱好者,我想把saba项目修改,让mmd嵌入桌面,但是我编译saba源代码过程中,加入模型没有bug,加入vmd程序报错。你在使用的过程中有载入vmd吗?有没有遇到bug,我想请教你一下。

    • KAAAsS 2020.03.17 1:01下午

      我自己实验的vmd和pmx都是正常的,你是怎么加入的?

      • WLJ 2020.03.17 1:07下午

        k大回复好快,谢谢啦。我先将pmx拖到saba成功加载,在将vmd拖进去,vs2019报错。错误信息是::0x00007FFFD523A859 处(位于 saba_viewer.exe 中)引发的异常: Microsoft C++ 异常: std::bad_alloc,位于内存位置 0x000000DA670FE560 处。

        • WLJ 2020.03.17 1:25下午

          还有一个也是导入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 已触发了一个断点。
          不晓得问题在哪,无从下手,哈啊哈

          • KAAAsS 2020.03.17 1:53下午

            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的源代码。

      • WLJ 2020.03.17 5:35下午

        好的,我试试,我是像先测试源程序能不能正常运行,之后再调用api。谢谢k大

      • WLJ 2020.03.26 7:49下午

        K大,我又来了,我这几天学了下opengl,返回来跳了一下,还是不行。saba_viewer和glfw,dx11三个文件都不能成功加载vmd,你可以给我你已经成功加载pmx和vmd的源文件吗?谢谢啦,想自己改源代码,无赖能力不及啊。

        • KAAAsS 2020.03.26 8:04下午

          我的项目现在不太好拆。saba自带的glfw就可以载入vmd,而且支持人物动作vmd&镜头vmd,不知是不是你没用对指令?或者是否是saba对部分特殊格式的vmd支持不全?另外,vmd和pmx模型是依赖名字建立映射的,虽然一般情况下都是没有问题,但是可以试着检查vmd文件是否能对应pmx。

          • WLJ 2020.03.26 8:12下午

            我试了很多vmd,都不行,而且vmd在其他软件里面都能和我用的模型匹配。没有修改过的saba_viewer就不能正常加载。能加个好友吗,想讨教一下,你不方便透露qq的话(我的:45***)

          • KAAAsS 2020.03.26 8:38下午

            不是很清楚你的验证消息,建议用邮箱联系我:admin@kaaass.net。用邮箱我通常会更有时间、精力编写完整的回复。建议提供具体的错误以供分析。不过我并不是saba的作者,我对saba的了解并不是很多,更建议在saba的repo里发issue询问原作者。

  3. mingy 2022.01.21 12:54上午

    https://github.com/assimp/assimp/tree/master/code/MMD
    这个地址失效了,求更新呀。

  4. mingy 2022.01.21 1:17上午

    想要遍历博主的blog,发现没有找到互相之间无交集的分类列表,似乎只能从1~15页翻着看,sad=_=

    • KAAAsS 2022.01.21 11:27上午

      TAT,这个确实是个问题,按理来说文章分类应该是只有一个,但是我之前一直多选

  5. mashiro 2023.10.15 8:18下午

    请教下下一步呢,怎么加载pmx模型?我现在是learnopengl.com学的,用assimp,是的assimp不会加载spa/sph toon纹理,但是我该使用saba来加载pmx模型呢,看各种加入saba等都要vs,能否用cmake mingw32-make编译呢,我还不是能了解,我环境是vscode mingw32-make,主要是就算我手动加载了uniform sample2D…等,但是sph/spa toon纹理的使用glsl又该怎么写?>﹏<,我再研究研究吧

    • KAAAsS 2023.10.27 11:48上午

      啊抱歉回复晚了!可以看我的课设项目( https://github.com/kaaass/3dg_proj ),这个项目就是使用了 saba 来载入 pmx 模型,而且还实现了 MMD 人物动画(没做镜头动作)。

      • mashiro 2023.10.28 3:06上午

        感谢回复!居然还有动画!我这就研究研究:D

在此评论中不能使用 HTML 标签。