2010-06-08 7 views
1

Я загрузил файл .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, нужно ли иметь массивы с избыточными данными, чтобы все они имели одинаковое количество элементов в такой же порядок? Я хотел бы знать, есть ли более простой способ заполнения буферов тем, как я уже собирал данные модели.

+0

В качестве комментария к вашей структуре 'Model': вы можете использовать' std :: vector' вместо необработанных массивов. Pass '& v [0]' вместо указателя массива на соответствующие функции gl. Вектор гарантированно будет вести себя точно так же, как массив - пока вы не измените его размер, так как это делает недействительными итераторы и указатели. – greyfade

ответ

3

Да, вы должны дублировать вершины, так как GL поддерживает только один индексный массив для всех атрибутов вершин.

С другой стороны, не используйте двойники, просто используйте поплавки, большинство графических процессоров не поддерживают их и преобразуют их в поплавки.

Смежные вопросы