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

Это поведение undefined, или атрибут вообще игнорируется?

Я искал документы довольно широко, и не смогли найти много информации о связи между программами и динамическими привязками атрибутов.

1
invertedPanda 23 Сен 2019 в 03:24

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 в программе меньше, то дополнительные компоненты в массиве вершины «не используются».

2
Rabbid76 5 Окт 2019 в 10:09