我想基于传递到着色器中的数据动态调用缓动。所以用伪代码:
var easing = easings[easingId]
var value = easing(point)
我想知道在GLSL中实现此目标的最佳方法。我可以某种方式使用switch语句,或者可以将缓动放入数组中并像这样使用它们。或者也许像上面的示例一样,可以创建一个哈希表并使用它。
easingsArray = [
cubicIn,
cubicOut,
...
]
uniform easingId
main() {
easing = easingsArray[easingId]
value = easing(point)
}
那将是潜在的数组方法。另一种方法是switch语句。也许还有其他。想知道推荐的方法是这样做的。也许我可以以某种方式使用结构...
答案 0 :(得分:1)
如果您需要在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不支持函数指针,因此,不幸的是,您正在考虑的那种动态分配解决方案(函数指针表等)将无法实现。
尽管您的问题明确地是关于将数据传递到着色器中的,但我也要指出,如果控制分支的值以统一的方式传递到着色器中,则可以改为编译着色器的多个变体,然后从应用程序本身动态选择合适的一个(即使用正确的缓动功能的选择)。这样可以节省着色器中分支的成本。