Итак, я могу прочитать вершин, нормалей и индексов, которые мне нужны из файла.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
}
Предполагается, что это кролик:
Есть идеи? Я предполагаю, что вершины находятся не в правильном порядке, но я проверил, и они, похоже, совпадают.
У меня была такая же проблема, когда я использовал GL_UNSIGNED_SHORT вместо спецификатора типа GL_UNSIGNED_INT для функции glDrawElements. Модель кролика (я полагаю, что это стэнфордский кролик?) Имеет более 200 000 вершин, поэтому для сохранения индексов недостаточно числа без знака, так как его максимальное значение равно 65535, поэтому следует использовать unsigned int. Может быть, ответ на вашу проблему?