Зачем указывать разные форматы вершин для одного атрибута?C++

Программы на C++. Форум разработчиков
Anonymous
Зачем указывать разные форматы вершин для одного атрибута?

Сообщение Anonymous »

Функции OpenGL glVertexAttribPointer и glVertexAttribFormat позволяют пользователю указать формат данных, которые будут привязаны к заданной переменной атрибута в программе шейдера при рендеринге. Формат атрибута вершины — это такая информация, как тип данных (, float, byte и т. д.), количество измерений в переменной атрибута (, vec3 и т. д.), следует ли нормализовать данные, а также смещение в массиве вершин для начальной позиции массива данных. Эти функции определяют формат при построении объекта массива вершин (VAO), и указанный формат является частью состояния VAO. Итак, вот мой вопрос:

Почему формат данных, связанных с атрибутом, является частью состояния VAO, а не частью состояния атрибута? Другими словами, почему формат данных связан с VAO, а не с атрибутом? При каких обстоятельствах у меня будут VAO, использующие разные форматы для одного и того же атрибута?

Для большей ясности приведу пример, который должен проиллюстрировать, почему я запутался. Представьте, что в моем вершинном шейдере я объявляю переменную:

Код: Выделить всё

in vec3 position;
Теперь я получаю местоположение атрибута в моем приложении 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

Вернуться в «C++»