有关mmd播放器,网上也有许多非常漂亮的实现,如 pmxeditor、saba、blender_mmd_tools等等。。
首先我想先介绍下我参考实现的仓库:
sselecirPyM/Coocoo3D: Experimental MMD renderer using DX12 and DXR. (github.com),这是sselecirPyM大神使用NET 6.0和DX12实现的mmd渲染器,支持自定义渲染管线、光照等,感兴趣的小伙伴可以在b站找他的视频,搜名字就好。
benikabocha/saba: OpenGL Viewer (OBJ PMD PMX) (github.com),这是国外一名大神使用c++做的mmd渲染器,支持卡通光照,我的代码基本上参考该仓库。
接下来我介绍下渲染的实现流程,方便大家熟悉代码。
mmd模型存在多种文件格式:
pmx、pmd属于模型文件,里面包含模型的最基本信息,顶点、Mesh、骨骼、材质等等。。
vmd属于动画文件,包含每一帧动画要做的处理,但vmd不能单独使用,他必须有一个模型作为载体。
代码流程:
-
解析模型、动画文件。(PmxParsing、VmdParsing).cs
-
管理该模型数据。(MMDModel、PmxModel).cs
-
管理动画数据。(VmdAnimation、VmdAnimationController).cs
-
管理模型的物理信息。(MMDRigidBody、MMDJoint、MMDPhysics、MMDPhysicsManager).cs
-
使用动画类对模型进行控制 VmdAnimation->MMDModel。
-
进行物理模拟 MMDPhysicsManager->MMDModel。
-
更新顶点数据并渲染 MMDModel->Update->Draw。
具体有关gles的渲染流程就不介绍了,非常简单。
- 遍历所有的meshes进行模型绘制,绑定纹理、shader参数等等。。
-
mmd模型存在描边,所以接下来我们再根据meshes绘制一遍(注意切换shader)
-
根据光照方向创建阴影矩阵,并在meshes里与模型矩阵相乘并进行绘制。
效果图: