【NET 7.0、OpenGL ES】使用Silk.NET渲染MMD,并实时进行物理模拟。

有关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不能单独使用,他必须有一个模型作为载体。

代码流程:

  1. 解析模型、动画文件。(PmxParsing、VmdParsing).cs

  2. 管理该模型数据。(MMDModel、PmxModel).cs

  3. 管理动画数据。(VmdAnimation、VmdAnimationController).cs

  4. 管理模型的物理信息。(MMDRigidBody、MMDJoint、MMDPhysics、MMDPhysicsManager).cs

  5. 使用动画类对模型进行控制 VmdAnimation->MMDModel。

  6. 进行物理模拟 MMDPhysicsManager->MMDModel。

  7. 更新顶点数据并渲染 MMDModel->Update->Draw。

具体有关gles的渲染流程就不介绍了,非常简单。

  1. 遍历所有的meshes进行模型绘制,绑定纹理、shader参数等等。。
  1. mmd模型存在描边,所以接下来我们再根据meshes绘制一遍(注意切换shader)

  2. 根据光照方向创建阴影矩阵,并在meshes里与模型矩阵相乘并进行绘制。

效果图:

仓库地址:qian-o/SabaSharp (github.com)