Как написать простую функцию сложения или умножения в GLSL - PullRequest
0 голосов
/ 15 марта 2019

Хотите знать, как написать GLSL-функции , которые могут принимать различные типы аргументов.

Насколько я понимаю, в GLSL a * b можно вызвать для vec2 * vec2, vec2 * vec3,..., vec2 * mat3 и т. Д. Для десятков возможных комбинаций.Мне интересно, как написать это как функцию, чтобы лучше понять язык.

Интересно, нужно ли вам на самом деле записывать каждую комбинацию:

vec2
multiply(vec2 a, vec2 b) {
  return a * b
}

vec3
multiply(vec3 a, vec3 b) {
  return a * b
}

....

Или еслиВы можете написать одну функцию, которая обрабатывает их все:

vec or mat
multiply(a, b) {
  return a * b
}

Не уверен, как это работает.Возможно, им всем нужны разные имена:

vec2
multiplyv2(vec2 a, vec2 b) {
  return a * b
}

vec3
multiplyv3(vec3 a, vec3 b) {
  return a * b
}

....

Обновление:

Первая часть решена :

vec2 rotate(vec2 v, float angle) {
  return rotation2d(angle) * v;
}

vec3 rotate(vec3 v, vec3 axis, float angle) {
  return (rotation3d(axis, angle) * vec4(v, 1.0)).xyz;
}

Вы можете перегрузить функции.

1 Ответ

2 голосов
/ 16 марта 2019

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

#define MULTIPLY_TEMPLATE(type) \
    type multiply(type a, type b) { \
        return a * b; \
    }

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