Вы не можете иметь входные данные вершинного шейдера struct
s.
Правильный способ сделать это - просто вставить их в vec4
.Если вы используете float[4]
, для этого потребуется четыре атрибута вместо одного.Массивы всегда занимают один атрибут на элемент.Поэтому, если вы сделаете layout(location = 7) in float[4] TexSrc;
, это займет индексы атрибутов 7, 8, 9 и 10. Это ужасная трата атрибутов, и это может ухудшить производительность.
Просто используйте vec4
каквсе остальные.Люди постоянно упаковывают входные данные в vec4
s;они используют комментарии, чтобы объяснить любые семантические странности.
Кстати, если вы получаете недопустимую операцию, это, вероятно, означает, что вы на самом деле не проверяли, правильно ли скомпилирован и связан ваш шейдер.Вы должны всегда делать это .
Новые вещи
OpenGL 4.4 или расширение ARB_enhanced_layouts, позволяющие вам делать что-то , например this.
Как указывалось ранее, основная проблема с layout(location = 7) in float[4] TexSrc;
заключается в том, что он занимает 4 места ввода.Поэтому, если у вас есть 4 числа с плавающей точкой, которые на самом деле не являются 4D-вектором, вам все равно придется упаковать их в vec4
для отправки в шейдер:
layout(location = 7) in vec4 rect;
Это затруднит понимание того, чтоrect.z
означает в шейдере, поскольку он не имеет какого-либо явного значения.
4.4 / extended_layouts позволяет упаковывать несколько переменных в одном месте, если их компоненты не перекрываются.Таким образом, если каждое местоположение концептуально является vec4
, мы можем разделить это на 2 vec2
с:
layout(location = 7, component = 0) in vec2 rectPos;
layout(location = 7, component = 2) in vec2 rectSize;
Теперь мы получаем некоторую семантическую информацию.rectPos
- это позиция прямоугольника, а rectSize
- его размер.И он все еще занимает только одно местоположение.
Функция расширенных макетов позволяет работать с любыми входами и выходами, а не только с вершинными шейдерами.