Какова наилучшая практика в отношении хранения данных вершин в Open GL? То есть:
struct VertexColored {
public:
GLfloat position[];
GLfloat normal[];
byte colours[];
}
class Terrian {
private:
GLuint vbo_vertices;
GLuint vbo_normals;
GLuint vbo_colors;
GLuint ibo_elements;
VertexColored vertices[];
}
или хранить их отдельно в требуемом классе, например:
class Terrian {
private:
GLfloat vertices[];
GLfloat normals[];
GLfloat colors[];
GLuint vbo_vertices;
GLuint vbo_normals;
GLuint vbo_colors;
GLuint ibo_elements;
}
Ответы:
Нет лучшей практики. Все зависит от приложения, которое разрабатывается.
Для игры визуализатора нет никакой необходимости хранить вершины как в RAM и VRAM , это означает , что вам нужно держать только ВБО идентификатор. Исключением является местность, где вам нужно иметь доступ к позициям из-за высоты размещения / столкновения игроков.
Вам нужно объединить все данные вершин? Если вы хотите иметь несколько цветов для одних и тех же вершин, например, разные цвета для одних и тех же моделей игроков, то объединение всего может создать небольшое препятствие для развития.
Вы получаете доступ к данным вне класса? Если нет, вы получите только больше кода, чем
vertices->position[i]
вместоpositions[i]
. В конструкторе игр / моделей вам нужен доступ к ним извне, но вы не получаете доступ ко всем данным одновременно, когда вы моделируете, затем вы получаете доступ к позициям, а когда вы красите, вы получаете доступ к цветам.Единственное, что я бы собрал - это
xyz
(rgb
) значения в одну структуру для более приятного кода:Изменить: Я хотел бы добавить, что некоторые люди используют
unions
для упрощения glVertex * 3v, glVertex * 4v, glUniform * v ... вызова, где массив передается вместо отдельных переменных:источник