При привязке индекса атрибута с помощью GLVERTEXTTRIBPOINTER, что происходит, когда связанная программа не содержит атрибута при указанном индексе?
Это поведение undefined, или атрибут вообще игнорируется?
Я искал документы довольно широко, и не смогли найти много информации о связи между программами и динамическими привязками атрибутов.
1 ответ
Программа не связана с объектом массива вершины. Индекс атрибута Vertex - это точка связывания. Если система обязательства не является «необходимой» программой, это не вызывает никакой проблемы.
[...] Как насчет того, что если есть атрибут в этом индексе, но он имеет другой тип, чем ранее, указанный с использованием
glVertexAttribPointer
[...]
opengl 4.6 Core API Спецификация профиля - 10.2.1 Текущие общие атрибуты, стр. 349:
Когда значения для переменной атрибута вершины шейдера получают из текущего общего значения атрибута, атрибут должен быть указан командой, совместимой с типом данных переменной.
Это означает, что тип данных атрибута является плавающей точкой, то вы должны указать массив данных атрибутов вершин glVertexAttribPointer
. Если тип данных является интегралом, вы используете {{{ X1}} (фокус на I
).
Если вы игнорируете это, то данные в буфере массива вершины будут неверно истолковываться.
opengl 4.6 API Core Спецификация профиля - 10.3.5 Передача элементов массива, стр. 361:
Когда вершина передается в GL by
DrawArrays
,DrawElements
, или другие командыDraw*
, описанные ниже, каждый универсальный атрибут расширяется до четырех компонентов. Если размер составляет один, то компонент атрибута X указывается массивом; Компоненты Y и компоненты W неявно установлены на 0, 0 и 1 соответственно. Если размер - это два, то компоненты атрибута y и Y указываются массивом; Компоненты Z и W неявно устанавливаются на 0 и 1 соответственно. Если размер - это три, то x , y , а y указаны, а w неявно устанавливается на 1. Если размер имеет четыре, то все компоненты указаны.
Таким образом, размер кортежа данных вершины и размер кортежного размера данных типа вершины атрибута в программе шейдеров (например, float
, vec2
, vec3
, vec3
, ...) разрешены быть другим.
Если размер кортежа атрибута Vertex в программе больше, то данные расширяются на 0 для 2md и 3RD соответственно 1 для 4-го компонента.
Если размер кортежного атрибута Vertex в программе меньше, то дополнительные компоненты в массиве вершины «не используются».
Похожие вопросы
Новые вопросы
opengl
OpenGL (Open Graphics Library) - это графический стандарт и API, который не зависит от платформы и доступен для настольных компьютеров, рабочих станций и мобильных устройств. Он предназначен для обеспечения аппаратно-ускоренного рендеринга и, следовательно, значительно повышает производительность по сравнению с традиционным программным рендерингом. OpenGL используется для таких приложений, как программное обеспечение САПР и компьютерные игры. Стандарт OpenGL, как и OpenGL ES, контролируется группой Khronos.