Вот проблема моего проекта, пожалуйста, смотрите на скриншоты:OpenGL (основной профиль) треугольников модели неправильно рендеринга
Мой объект построен в неправильно путь. Вершины не связаны должным образом. Я подозреваю, что это как-то связано с индексами модели. Во всяком случае вот код, который строит сетку для меня:
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);
}
}
Вопрос заключается в почему у моей модели неправильные треугольники? Запросить дополнительную информацию. Благодарим вас за помощь, ребята!
спасибо, гуру! Он решил проблему. Делает совершенный смысл. Я часто копирую-пасту для циклов, и в результате некоторые вещи остаются забытыми. –