3-2网格

45 阅读1分钟

加载网格需要顶点,包含位置向量,法向量和纹理坐标向量,还需要索引和材质数据

定义顶点类

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);
}