2016-07-14 49 views
0

這裏是我的項目的問題,請看截圖:的OpenGL(核心配置文件)模型的三角形錯渲染

  1. problems
  2. original(correct)

我的目標是建立在一個錯誤的辦法。頂點沒有正確連接。 我懷疑它與模型的索引有關。反正這裏是構建網格爲我的代碼:

mesh model::processMesh(aiMesh * mesh_, const aiScene * scene) 
{ 
    std::vector<vertex> vertices; 
    std::vector<GLuint> indices; 
    std::vector<texture> textures; 

    //vertices 
    for (GLuint i = 0; i < mesh_->mNumVertices; i++) 
    { 
     vertex vert; 
     glm::vec3 vector; 

     //positions 
     vector.x = mesh_->mVertices[i].x; 
     vector.y = mesh_->mVertices[i].y; 
     vector.z = mesh_->mVertices[i].z; 
     vert.position = vector; 

     //normals 
     vector.x = mesh_->mNormals[i].x; 
     vector.y = mesh_->mNormals[i].y; 
     vector.z = mesh_->mNormals[i].z; 
     vert.normal = vector; 

     //texture coords 
     if (mesh_->mTextureCoords[0]) 
     { 
      glm::vec2 vector_; 
      vector_.x = mesh_->mTextureCoords[0][i].x; 
      vector_.y = mesh_->mTextureCoords[0][i].y; 
      vert.texCoords = vector_; 
     } 
     else vert.texCoords = glm::vec2(0.0f, 0.0f); 

     vertices.push_back(vert); 
    } 

    //indices 
    for (GLuint i = 0; i < mesh_->mNumFaces; i++) 
    { 
     aiFace face = mesh_->mFaces[i]; 
     for (GLuint j = 0; j < mesh_->mNumFaces; j++) indices.push_back(face.mIndices[j]); 
    } 

    //textures 
    if (mesh_->mMaterialIndex >= 0) 
    { 
     aiMaterial* material = scene->mMaterials[mesh_->mMaterialIndex]; 

     //diffuse 
     std::vector<texture> diffuseMaps = this->loadMaterialTextures(material, aiTextureType_DIFFUSE, TEX_DIFF_NAME); 
     textures.insert(textures.end(), diffuseMaps.begin(), diffuseMaps.end()); 
     //specular 
     std::vector<texture> specularMaps = this->loadMaterialTextures(material, aiTextureType_SPECULAR, TEX_SPEC_NAME); 
     textures.insert(textures.end(), specularMaps.begin(), specularMaps.end()); 
    } 

    return mesh(vertices, indices, textures); 
} 

在這個函數中我設置的所有對象:

void mesh::setupMesh() 
{ 
    //buffers 
    glGenVertexArrays(1, &this->vao); 
    glGenBuffers(1, &this->vbo); 
    glGenBuffers(1, &this->ebo); 

    glBindVertexArray(this->vao); 

    glBindBuffer(GL_ARRAY_BUFFER, this->vbo); 
    glBufferData(GL_ARRAY_BUFFER, this->vertices.size() * sizeof(vertex), &this->vertices[0], GL_STATIC_DRAW); 

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, this->ebo); 
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, this->indices.size() * sizeof(GLuint), &this->indices[0], GL_STATIC_DRAW); 

    //attributes 
    glEnableVertexAttribArray(0); 
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(vertex), (GLvoid*)0); 
    glEnableVertexAttribArray(1); 
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(vertex), (GLvoid*)offsetof(vertex, normal)); 
    glEnableVertexAttribArray(2); 
    glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(vertex), (GLvoid*)offsetof(vertex, texCoords)); 

    //unbind 
    glBindVertexArray(0); 
} 

,這裏是渲染

void mesh::draw(shader* shader) 
{ 
    GLuint tex_diffNumber = 1; 
    GLuint tex_specNumber = 1; 

    for (GLuint i = 0; i < this->textures.size() ; i++) 
    { 
     //load target texture 
     glActiveTexture(GL_TEXTURE0 + i); 

     std::stringstream sstream; 
     std::string number; 
     std::string name = this->textures[i].type; 

     if (name == TEX_DIFF_NAME) 
      sstream << tex_diffNumber++; 
     else if (name == TEX_SPEC_NAME) 
      sstream << tex_specNumber++; 

     number = sstream.str(); 

     glBindTexture(GL_TEXTURE_2D, this->textures[i].id); 
     glUniform1i(glGetUniformLocation(shader->shaderProgID, (name + number).c_str()), i); 

    } 

    //set shininess 
    //glUniform1f(glGetUniformLocation(shader->shaderProgID, "material.shininess"), 16.0f); 

    //draw 
    glBindVertexArray(this->vao); 
    glDrawElements(GL_TRIANGLES, this->indices.size(), GL_UNSIGNED_INT, 0); 
    glBindVertexArray(0); 

    //release 
    for (GLuint i = 0; i < this->textures.size(); i++) 
    { 
     glActiveTexture(GL_TEXTURE0 + i); 
     glBindTexture(GL_TEXTURE_2D, 0); 
    } 
} 

的問題是爲什麼我的模型有錯誤的三角形? 問任何其他信息。 謝謝你提前幫忙,夥計們!

回答

2
for (GLuint i = 0; i < mesh_->mNumFaces; i++) 
{ 
    aiFace face = mesh_->mFaces[i]; 
    for (GLuint j = 0; j < mesh_->mNumFaces; j++) 
     indices.push_back(face.mIndices[j]); 
} 

這看起來不對我。我不認爲內循環應該再次運行所有面。相反,它應遍歷所有指數在臉上:

for (GLuint i = 0; i < mesh_->mNumFaces; i++) 
{ 
    aiFace face = mesh_->mFaces[i]; 
    for (GLuint j = 0; j < face->mNumIndices; j++) 
     indices.push_back(face.mIndices[j]); 
} 

注意,原來的版本閱讀可用內存之外,由於環路是最可能下去,直到J = 5(六面),但有隻有最多四個指數的面孔。如果有人會連接一個調試器並逐步通過它,這應該很容易看到。

+0

謝謝大師!它解決了這個問題。非常有意義。我經常複製粘貼循環,結果有些東西被遺忘。 –