Зачем указывать разные форматы вершин для одного атрибута?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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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