Рендеринг файлов .ply в OpenGL

0

Итак, я могу прочитать вершин, нормалей и индексов, которые мне нужны из файла.ply, и записать их в VBO. Однако я не получаю правильные формы. Кажется, мои индексы отключены.

Здесь мои структуры:

typedef struct vtx {
    float x, y, z;
    float nx, ny, nz;
} vtx;

typedef struct Face {
    unsigned int count;
    unsigned int *vertices;
    float nx, ny, nz;
} Face;

typedef struct PLY_vals {
    Face **f;
    vtx **v;
    unsigned int vcount;
    unsigned int fcount;
    int norms;
    float center[3];
} PLY_vals;

Настройка вершин и треугольников:

nindices = ply.fcount * 3;
nvertices = ply.vcount;
pindices = new GLuint[nindices];
plyverts = new Vertex[nvertices];

for (int i = 0; i < nvertices; i++)
{
    // Vertices
    plyverts[i].location[0] = ply.v[i]->x;
    plyverts[i].location[1] = ply.v[i]->y;
    plyverts[i].location[2] = ply.v[i]->z;
    plyverts[i].location[3] = 1;

    // Normals
    plyverts[i].normal[0] = ply.v[i]->nx;
    plyverts[i].normal[1] = ply.v[i]->ny;
    plyverts[i].normal[2] = ply.v[i]->nz;
    plyverts[i].normal[3] = 0;
}

// set indices (assumes all faces have 3 vertices
int pos=0;
for (int i = 0; i < nindices/3; i++)
{
    pindices[pos++] = ply.f[i]->vertices[0];    // first vertex
    pindices[pos++] = ply.f[i]->vertices[1];    // second vertex
    pindices[pos++] = ply.f[i]->vertices[2];    // third vertex
}

Предполагается, что это кролик:

Изображение 174551

Есть идеи? Я предполагаю, что вершины находятся не в правильном порядке, но я проверил, и они, похоже, совпадают.

  • 0
    Кажется, что вершины верны, потому что это похоже на форму кролика, что я считаю неправильным, так это индексы, которые образуют эти огромные треугольники.
  • 0
    Попробуйте сделать вершины просто точками. Это скажет вам, если вершины верны или нет.
Показать ещё 2 комментария
Теги:
opengl
rendering

1 ответ

2
Лучший ответ

У меня была такая же проблема, когда я использовал GL_UNSIGNED_SHORT вместо спецификатора типа GL_UNSIGNED_INT для функции glDrawElements. Модель кролика (я полагаю, что это стэнфордский кролик?) Имеет более 200 000 вершин, поэтому для сохранения индексов недостаточно числа без знака, так как его максимальное значение равно 65535, поэтому следует использовать unsigned int. Может быть, ответ на вашу проблему?

  • 0
    Это было в значительной степени это. Я использовал GL_UNSIGNED_BYTE, а не GL_UNSIGNED_INT. Спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню