Попытка изменить это Учебное пособие по OpenGL и GLKit на raywenderlich.com. Я пытаюсь визуализировать куб из obj-файла волнового фронта без информации о цвете каждой вершины и с нормалями поверхности. Но то, что визуализируется, совсем не похоже на куб.
Для анализа файла obj у меня есть метод (createDrawable), который проходит через obj и сохраняет информацию в структуру (Drawable), содержащую четыре вещи: буфер вершин, индексный буфер, количество граней в объекте и матрицу преобразования объекта. объект. (Вот заголовок, .m и файл .obj.)
- (Drawable)createDrawable: (NSString *)objFileName {
......
......
// Parsed obj and put info in vertexData and indices arrays.
Drawable _drawable;
_drawable.numFaces = numFaces;
glGenBuffers(1, &_drawable.vertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, _drawable.vertexBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertexData) * numFaces * 8, vertexData, GL_STATIC_DRAW);
glGenBuffers(1, &_drawable.indexBuffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _drawable.indexBuffer);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices) * numFaces * 3, indices, GL_STATIC_DRAW);
_drawable.matrix = GLKMatrix4Identity;
_drawable.matrix = GLKMatrix4Translate(_drawable.matrix, 0.0f, 0.0f, 10.0f);
return _drawable;
}
Для рендеринга я использую другой метод (renderDrawable), который связывает буферы объекта, устанавливает на них указатели и затем рендерит с помощью glDrawElements(..).
- (void) renderDrawable: (Drawable)object {
glBindBuffer(GL_ARRAY_BUFFER, object.vertexBuffer);
glEnableVertexAttribArray(GLKVertexAttribPosition);
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 0, (const GLvoid *) 0);
glEnableVertexAttribArray(GLKVertexAttribTexCoord1);
glVertexAttribPointer(GLKVertexAttribTexCoord1, 2, GL_FLOAT, GL_FALSE, 0, (const GLvoid *) 3);
glEnableVertexAttribArray(GLKVertexAttribNormal);
glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 0, (const GLvoid *) 5);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, object.indexBuffer);
glDrawElements(GL_LINES, sizeof(object.indexBuffer) * 3 * object.numFaces, GL_UNSIGNED_BYTE, (const GLvoid *) object.indexBuffer);
}
Я думаю, что делаю что-то не так с буферами (часть createDrawable, показанная здесь, и renderDrawable в файле .m), но я просто не могу понять, что это такое.