首页 > 解决方案 > 如何在 GLSL 中编写简单的加法或乘法函数

问题描述

想知道如何编写可以接受不同类型参数的GLSL 函数。

据我了解,在 GLSLa * 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;
}

您可以重载函数。

标签: functionglsl

解决方案


GLSL 没有模板或泛型,因此您无法让编译器自动为您生成不同类型的函数实例。但是,正如您所发现的,它确实支持函数重载,因此您可以使用宏来为不同类型实例化相同的函数,从而减少代码重复。

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

MULTIPLY_TEMPLATE(vec2)
MULTIPLY_TEMPLATE(vec3)
MULTIPLY_TEMPLATE(vec4)

推荐阅读