GLSL "в" структурах - PullRequest
       17

GLSL "в" структурах

3 голосов
/ 14 февраля 2012

Мне не разрешено использовать структуру с ключевым словом in, не так ли?Например:

struct Rect {
    float x,y,width,height;
};

layout(location = 7) in Rect TexSrc;

Это трудно для Google, но я получаю сообщение об ошибке при попытке использовать мой шейдер GLSL (INVALID_OPERATION).Похоже, мне разрешено использовать float[4].

Если мне не разрешено использовать структуру, что вы предлагаете мне сделать?Построить структуру из float[4] или поглотить ее, отказаться от красивого API и везде использовать индексы 0-3?

(A vec4 также будет работать здесь, я знаю, но z и w не имеют такого же значения, как "ширина" и "высота", и это только один пример)

Полагаю, вы можете указать только один тип для местоположения с помощью glVertexAttribPointer, поэтому я могу понять, почему структура была бы запрещена ... Я просто пытаюсь придумать, как сохранить мой код чистым и понятным без потери производительности.

1 Ответ

4 голосов
/ 14 февраля 2012

Вы не можете иметь входные данные вершинного шейдера 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 - его размер.И он все еще занимает только одно местоположение.

Функция расширенных макетов позволяет работать с любыми входами и выходами, а не только с вершинными шейдерами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...