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显示指定一下。
有了纹理和基础光照后,一个基础的效果就出来了 ^ ^