2016-09-01 3 views
1

Я выгрузка .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);

В результате, ничто не оказывает на всех ...

+0

Вы оставляете здесь важную информацию, например, как настроить буфер (glBindBuffer, glEnableVertexAttribArray, glVertexAttribPointer). Как выглядит ваш .obj? Разрешено ли отбрасывание поверхности? – Andreas

+0

Разрешено обратное отбрасывание. Я использую Qt для шейдеров и VAO на самом деле. Я редактирую, чтобы вы могли видеть, как я их настраивал. –

+0

Недостаточно брать только верхушки. Вам также нужны лица, чтобы узнать, как собираются вершины. – BDL

ответ

0

С флагами вы обеспечиваете я бы ожидать 24 вершин, которые будут созданы: Куб состоит из 6 граней, каждая из которых состоит из 2-х треугольников. Когда теперь генерируются нормали (по запросу aiProcess_GenNormals), каждая сторона куба имеет 4 уникальные вершины. Обратите внимание, что эта вершина относится к комбинации позиции и нормали. 4 уникальных вершины и шесть сторон - всего 24 вершины.

Теперь проблема с рисунком: поскольку запрос aiProcess_JoinIdenticalVertices, аффирм объединит все идентичные вершины, оставив только эти уникальные вершины в массиве aiMesh->mVertices. В одиночку эту информацию недостаточно для рисования. Кроме того, требуется информация о том, как эти вершины должны собираться в треугольниках, которые даются aiMesh->mFaces. С этих лиц нужно либо создать индексный буфер, либо собрать вершины в новый массив, дублируя их в правильном порядке. Следующий код показывает, как можно построить данные для индексного буфера:

std::vector<unsigned int> indices; 
indices.reserve(aimesh->mNumFaces * 3); 
for (unsigned int fid = 0; fid < aimesh->mNumFaces; fid++) 
{ 
    auto& face = aimesh->mFaces[fid]; 
    for (size_t iid = 0; iid < 3; iid++) 
     indices.push_back(face.mIndices[iid]); 
} 

Данные индексы, чем могут быть использованы OpenGL.

+0

Спасибо за подсказку, но я не могу сделать эту работу, cf мое последнее редактирование ... –