Использование вершинных буферов OpenGL в C ++ - PullRequest
1 голос
/ 08 июня 2010

Я загрузил файл Wavefront .obj и нарисовал его в немедленном режиме, и он отлично работает.
Я сейчас пытаюсь нарисовать ту же модель с буфером вершин, но у меня есть вопрос.

Данные моей модели организованы в следующих структурах:

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

1 Ответ

3 голосов
/ 08 июня 2010

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

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

...