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 标签。