加载网格需要顶点,包含位置向量,法向量和纹理坐标向量,还需要索引和材质数据
定义顶点类
struct Vertex
{
glm::vec3 Position;
glm::vec3 Normal;
glm::vec2 TexCoords;
};
定义Texture类
struct Texture
{
unsigned int id;//编号
string type;//漫反射or镜面反射贴图
};
以下是Mesh类
ffMesh(std::vector<ffVertex> _vertexVec, std::vector<unsigned int> _indexVec, std::vector<ffTexture> _textureVec)
{
vertexVec = _vertexVec;
indexVec = _indexVec;
textureVec = _textureVec;
setupMesh();
}
void setupMesh()
{
unsigned int VBO = 0;
unsigned int EBO = 0;
glGenVertexArrays(1, &VAO);//创建VAO
glBindVertexArray(VAO);//绑定VAO
glGenBuffers(1, &VBO);//创建VBO
glBindBuffer(GL_ARRAY_BUFFER, VBO);//绑定VBO
glBufferData(GL_ARRAY_BUFFER, sizeof(ffVertex) * vertexVec.size(), &vertexVec[0], GL_STATIC_DRAW);//更新VBO
glGenBuffers(1, &EBO);//创建EBO
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);//绑定EBO
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(unsigned int) * indexVec.size(), &indexVec[0], GL_STATIC_DRAW);//更新EBO
//确定position在顶点中的位置
glEnableVertexAttribArray((int)ShaderLocation::position);
glVertexAttribPointer((int)ShaderLocation::position, 3, GL_FLOAT, GL_FALSE, sizeof(ffVertex), (void*)offsetof(ffVertex, m_pos));
//确定normal在顶点中的位置
glEnableVertexAttribArray((int)ShaderLocation::normal);
glVertexAttribPointer((int)ShaderLocation::normal, 3, GL_FLOAT, GL_FALSE, sizeof(ffVertex), (void*)offsetof(ffVertex, m_normal));
//确定texcoord在顶点中的位置
glEnableVertexAttribArray((int)ShaderLocation::texcoord);
glVertexAttribPointer((int)ShaderLocation::texcoord, 2, GL_FLOAT, GL_FALSE, sizeof(ffVertex), (void*)offsetof(ffVertex, m_texCoord));
glBindVertexArray(0);
}
void draw(Shader& shader)
{
for (int i = 0; i < textureVec.size(); i++)
{
//绑定所在纹理的ID
glActiveTexture(GL_TEXTURE0 + i);
glBindTexture(GL_TEXTURE_2D, textureVec[i].m_id);
shader.setInt(textureVec[i].sampler2D_name, i);
}
glActiveTexture(GL_TEXTURE0);
glBindVertexArray(VAO);
glDrawElements(GL_TRIANGLES, indexVec.size(), GL_UNSIGNED_INT, 0);
glBindVertexArray(0);
}