Функции OpenGL glVertexAttribPointer и glVertexAttribFormat позволяют пользователю указать формат данных, которые будут привязаны к заданной переменной атрибута в программе шейдера при рендеринге. Формат атрибута вершины — это такая информация, как тип данных (
, float, byte и т. д.), количество измерений в переменной атрибута (
, vec3 и т. д.), следует ли нормализовать данные, а также смещение в массиве вершин для начальной позиции массива данных. Эти функции определяют формат при построении объекта массива вершин (VAO), и указанный формат является частью состояния VAO. Итак, вот мой вопрос:
Почему формат данных, связанных с атрибутом, является частью состояния VAO, а не частью состояния атрибута? Другими словами, почему формат данных связан с VAO, а не с атрибутом? При каких обстоятельствах у меня будут VAO, использующие разные форматы для одного и того же атрибута?
Для большей ясности приведу пример, который должен проиллюстрировать, почему я запутался. Представьте, что в моем вершинном шейдере я объявляю переменную:
Теперь я получаю местоположение атрибута в моем приложении OpenGL:
Код: Выделить всё
GLint positionAttribute = glGetAttribLocation(myProgram, "position");
Теперь, когда я создаю VAO, я указываю формат данных следующим образом:
Код: Выделить всё
glVertexAttribFormat(positionAttribute, 3, GL_FLOAT, GL_FALSE, 0);
Поскольку формат связан с VAO, каждый раз, когда я создаю VAO, мне приходится указывать формат. Атрибут «position» — vec3, поэтому я всегда буду указывать 3 и GL_FLOAT для glVertexAttribFormat. Так почему же OpenGL спроектирован таким образом, что мне потенциально придется вызывать glVertexAttribFormat каждый раз, когда я создаю VAO, и указывать формат, который останется постоянным? Мне кажется, мне следовало указать формат при вызове glGetAttribLocation, чтобы сделать это только один раз.
Подробнее здесь:
https://stackoverflow.com/questions/291 ... -attribute