Я загрузил файл .obj Wavefront и нарисовал его в непосредственном режиме, и он отлично работает.
Теперь я пытаюсь нарисовать ту же модель с буфером вершин, но у меня есть вопрос.Использование вершинных буферов OpenGL в C++
Мои модели данные организованы в следующих структурах:
struct Vert
{
double x;
double y;
double z;
};
struct Norm
{
double x;
double y;
double z;
};
struct Texcoord
{
double u;
double v;
double w;
};
struct Face
{
unsigned int v[3];
unsigned int n[3];
unsigned int t[3];
};
struct Model
{
unsigned int vertNumber;
unsigned int normNumber;
unsigned int texcoordNumber;
unsigned int faceNumber;
Vert * vertArray;
Norm * normArray;
Texcoord * texcoordArray;
Face * faceArray;
};
Как сейчас, я не думаю, что есть какие-либо избыточные данные, так как множество граней структура может указывать на ту же вершину, нормальные, или координаты текстуры.
Когда я создаю vbo для вершинных положений, нормалей и координат текстур и назначаю их им с помощью glBufferData, нужно ли иметь массивы с избыточными данными, чтобы все они имели одинаковое количество элементов в такой же порядок? Я хотел бы знать, есть ли более простой способ заполнения буферов тем, как я уже собирал данные модели.
В качестве комментария к вашей структуре 'Model': вы можете использовать' std :: vector' вместо необработанных массивов. Pass '& v [0]' вместо указателя массива на соответствующие функции gl. Вектор гарантированно будет вести себя точно так же, как массив - пока вы не измените его размер, так как это делает недействительными итераторы и указатели. – greyfade