Я выгрузка .obj модели кубы в настоящее время использует эти флаги:Assimp погрузчик с кубом из 8 вершин
const aiScene* scene = importer.ReadFile(path, aiProcess_Triangulate | aiProcess_FlipUVs | aiProcess_GenNormals | aiProcess_JoinIdenticalVertices);
модель содержит только 8 вершин (каждый SOMMET кубы) и, следовательно, нет дублировать вершины, чтобы указать прокси для рисования всех необходимых треугольников. В результате я получаю только 3 треугольника моей коробки.
Я считаю, что это происходит потому, что я использую:
glDrawArrays(GL_TRIANGLES, 0, vertices.size());
Где vertices.size() равно 22 (это возвращение Сетка-> mNumVertices).
Я не получаю это 22, для меня это должно быть 8 или 6 * 2 * 3 = 36 (6 лиц с двумя треугольниками каждый). Может ли кто-нибудь объяснить, откуда он?
Хотя я использовал GL_TRIANGLE_STRIP, но вершины не в правильном порядке (я даже не знаю, могут ли они быть). Я получаю больше треугольников, но не правильных.
Так что мой главный вопрос: есть ли флаг, который я мог бы добавить в ReadFile, или что-то еще - написать копию вершин для каждого треугольника, который будет рисоваться в файле .obj.
PS: Я экспортировал модель Wavefront из Blender, возможно, это на Blender, что я могу установить что-то, чтобы экспортировать redondant vertices.
Мой файл .obj: о 1
# Vertex list
v -0.5 -0.5 0.5
v -0.5 -0.5 -0.5
v -0.5 0.5 -0.5
v -0.5 0.5 0.5
v 0.5 -0.5 0.5
v 0.5 -0.5 -0.5
v 0.5 0.5 -0.5
v 0.5 0.5 0.5
usemtl Default
f 4 3 2 1
f 2 6 5 1
f 3 7 6 2
f 8 7 3 4
f 5 8 4 1
f 6 7 8 5
EDIT: Как настроить сетку с типами Qt OpenGL (и теперь с EBO):
void setupMesh(QOpenGLShaderProgram* program)
{
// Create Vertex Array Object
if (!VAO->isCreated()) {
VAO->create();
}
VAO->bind();
VBO.create();
VBO.bind();
VBO.setUsagePattern(QOpenGLBuffer::StaticDraw);
construct_sg_vertex();
VBO.allocate(this->m_vec.constData(), this->m_vec.size() * sizeof(m_vec.at(0)));
EBO.create();
EBO.bind(); //glBindBuffer(GL_ARRAY_BUFFER, ebo);
EBO.setUsagePattern(QOpenGLBuffer::StaticDraw);
EBO.allocate(indices.data(),indices.size()*sizeof(GLuint));
// 0 : positions
program->enableAttributeArray(0);
program->setAttributeBuffer(0, GL_FLOAT, Vertex::positionOffset(), Vertex::PositionTupleSize, Vertex::stride());
//1: colors
program->enableAttributeArray(1);
program->setAttributeBuffer(1, GL_FLOAT, Vertex::colorOffset(), Vertex::ColorTupleSize, Vertex::stride());
VBO.release();
EBO.release();
}
private:
QOpenGLBuffer VBO ;
QOpenGLVertexArrayObject* VAO = new QOpenGLVertexArrayObject();
QOpenGLBuffer EBO ; //New Element Buffer
};
С этим добавленным индексы буфера Я изменил способ, которым я рисую: VAO-> bind(); glDrawElements (GL_TRIANGLES, indices.size(), GL_UNSIGNED_INT, 0);
В результате, ничто не оказывает на всех ...
Вы оставляете здесь важную информацию, например, как настроить буфер (glBindBuffer, glEnableVertexAttribArray, glVertexAttribPointer). Как выглядит ваш .obj? Разрешено ли отбрасывание поверхности? – Andreas
Разрешено обратное отбрасывание. Я использую Qt для шейдеров и VAO на самом деле. Я редактирую, чтобы вы могли видеть, как я их настраивал. –
Недостаточно брать только верхушки. Вам также нужны лица, чтобы узнать, как собираются вершины. – BDL