openGL GLFW PMX模型 学习笔记 m8w2(d2-d7)

骨骼变形

在之前的顶点信息这一块,有一个参数是权重类型,对应了4个权重情况。

1. BDEF (Bone Deform)

BDEF是一种基本的骨骼绑定方法。根据影响的骨骼数量,BDEF可以分为几种类型:

  • BDEF1:每个顶点由一个骨骼完全控制。顶点的权重完全赋予一个骨骼。
  • BDEF2:每个顶点由两个骨骼共同控制。每个骨骼都有一个权重值,表示其对顶点位置的影响程度。
  • BDEF4:每个顶点由四个骨骼共同控制。和BDEF2类似,只是增加了更多的骨骼控制。

2. SDEF (Spherical Deformation)

SDEF是一种改进的绑定方法,它提供了更平滑的变形效果,特别是在关节区域。SDEF通过添加形状变形来补偿传统线性骨骼绑定的局限性,从而减少皮肤穿插和不自然的弯曲。它使用一个球形控制器来定义变形范围,能更好地模拟肌肉和软组织的形变。

3. QDEF (Quaternion Deformation)

QDEF使用四元数来处理旋转和变形。这种方法能提供更平滑的变形效果,特别是在处理复杂旋转时。四元数可以避免常规欧拉角表示中常见的万向锁问题,因此在动画中提供更自然的旋转表现。

这部分的叫法都MMD中专门使用的方法/叫法,很不友好。这里的BDEF,SDEF和QDEF其实就是不同的蒙皮方法,但这里的叫法和主流叫法有区别,实际内容是一样的。比如在目前主流的模型格式比如FBX,GLTF等中,BDEF更普遍的叫法是LBS (Linear Blend Skinning),QDEF应该就是DQS(Dual Quaternion)我猜,SDEF没有找到相似的。

PMX字符串

PMX模型文件中,字符串以'\0'结尾,且每个字符串前4个字节用做记录字符串的长度。

纹理信息

和之前相同,第一块是纹理的数量,然后按数量取出所有纹理的路径【都是字符串】。

材质信息

同上,第一部分是材质的数量,然后是一系列的材质参数。

struct PMXmat {
    string mName;
    string mEnglishName;

    glm::vec4 diffuse;
    glm::vec3 specular;
    float specularPow;
    glm::vec3 ambient;

    uint8_t drawMode;
    glm::vec4 edgeColor;
    float edgeSize;

    int32_t textureIndex;
    int32_t sphereTextureIndex;

    int8_t sphereMode;
    int8_t toonMode;

    int32_t toonTextureIndex;

    string memo;

    int32_t faceNumber;
};

这里只使用了其中几个和bling phong光照模型有关的参数。这一块先用stbi_load读取图像,然后激活N个纹理单元(纹理单元可以用 GL_TEXTURE0 + i 来表示第i个纹理单元),分别存储对应的纹理图像,现在我们就可以在着色器中获取到UV坐标纹理图像了。由于不同的顶点对应不同的纹理图像,所以这里还得创建M个EBO,M等于材质的数量,再把各个材质对应的顶点放到对应的EBO中。在渲染过程中,针对不同的EBO用 glUniform1i(glGetUniformLocation(ObjShader.ID, "cTexture"), static_cast<int>(matrials[i].textureIndex)); 使用不同的纹理。

如果只使用了一个纹理单元,不需要显示指定uniform。如果是多个纹理单元,就得用glUniform1i显示指定一下。

有了纹理和基础光照后,一个基础的效果就出来了 ^ ^

posted @ 2024-08-08 09:20  PAddingoi  阅读(4)  评论(0编辑  收藏  举报  来源