GLSL: Как сделать переключение как заявление - PullRequest
0 голосов
/ 15 марта 2019

Я хотел бы динамически вызывать замедление на основе данных, передаваемых в шейдер.Итак, в псевдокоде:

var easing = easings[easingId]
var value = easing(point)

Мне интересно, как лучше всего это сделать в GLSL.Я мог бы использовать оператор switch каким-то образом, или мог бы поместить ослабления в массив и использовать их таким образом.Или, может быть, есть способ создать хеш-таблицу и использовать ее, как в приведенном выше примере.

easingsArray = [
  cubicIn,
  cubicOut,
  ...
]

uniform easingId

main() {
  easing = easingsArray[easingId]
  value = easing(point)
}

Это было бы возможным подходом к массиву.Другой подход - это оператор switch.Может быть, есть другие.Хотите знать, что рекомендуемый способ сделать это.Может быть, я мог бы использовать структуру как-то ...

1 Ответ

1 голос
/ 18 марта 2019

Если вам нужно условное ветвление в GLSL (в вашем случае для выбора функции замедления на основе переменной), вам нужно использовать операторы if или switch.

Например

if (easingId == 0) {
    result = cubicIn();
} else if (easingId == 1) {
    result = cubicOut();
}

или

switch (easingId) {
case 0:
    result = cubicIn();
    break;
case 1:
    result = cubicOut();
    break;
}

GLSL не поддерживает указатели функций, поэтому, к сожалению, решения с динамической диспетчеризацией (таблицы указателей функций и т. Д.) Будут невозможны.

Хотя ваш вопрос явно касался данных, передаваемых в шейдер, я также хотел бы отметить, что если значение, управляющее ветвью, передается в шейдер как единое целое, то вместо этого вы можете скомпилировать несколько вариантов вашего шейдера. , а затем динамически выбрать правильный (то есть тот, который использует правильную функцию замедления) из самого приложения. Это сэкономит стоимость ветвления в шейдере.

...