function - 如何在 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;
}
您可以重载函数。
解决方案
GLSL 没有模板或泛型,因此您无法让编译器自动为您生成不同类型的函数实例。但是,正如您所发现的,它确实支持函数重载,因此您可以使用宏来为不同类型实例化相同的函数,从而减少代码重复。
#define MULTIPLY_TEMPLATE(type) \
type multiply(type a, type b) { \
return a * b; \
}
MULTIPLY_TEMPLATE(vec2)
MULTIPLY_TEMPLATE(vec3)
MULTIPLY_TEMPLATE(vec4)
推荐阅读
- java - Java 日期转换格式
- docx - 在 Midnight Commander 中查看 MS Word .docx 文件
- mongodb - 如何使用 Mongdb 按选定属性(嵌套)计算对象数
- android - Android GeoCoder 服务不可用错误
- sonarqube - 提取 sonar-scanner-api-batch.jar 失败:该进程无法访问该文件,因为它正被另一个进程使用
- java - 从数据库中获取数据的java代码是什么
- javascript - 如何在javascript中使用reduce函数调用promise中的函数
- swift - 在 UITableView 中突出显示和取消突出显示搜索到的文本
- azure-devops - 运行 azure devops YML 文件时当前不支持锚点
- python - 使用 fuzz.ratio 时出现类型错误