如何在GLSL中编写简单的加法或乘法函数

问题描述 投票:0回答:1

想知道如何编写可以采用不同类型参数的GLSL functions

根据我的理解,在GLSL中a * b可以被称为vec2 * vec2vec2 * 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
}

....

更新:

第一部分是solved

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;
}

你可以重载功能。

function glsl
1个回答
2
投票

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

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

MULTIPLY_TEMPLATE(vec2)
MULTIPLY_TEMPLATE(vec3)
MULTIPLY_TEMPLATE(vec4)
© www.soinside.com 2019 - 2024. All rights reserved.