GLSL:如何执行类似开关的语句

时间:2019-03-14 23:54:31

标签: glsl shader

我想基于传递到着色器中的数据动态调用缓动。所以用伪代码:

var easing = easings[easingId]
var value = easing(point)

我想知道在GLSL中实现此目标的最佳方法。我可以某种方式使用switch语句,或者可以将缓动放入数组中并像这样使用它们。或者也许像上面的示例一样,可以创建一个哈希表并使用它。

easingsArray = [
  cubicIn,
  cubicOut,
  ...
]

uniform easingId

main() {
  easing = easingsArray[easingId]
  value = easing(point)
}

那将是潜在的数组方法。另一种方法是switch语句。也许还有其他。想知道推荐的方法是这样做的。也许我可以以某种方式使用结构...

1 个答案:

答案 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不支持函数指针,因此,不幸的是,您正在考虑的那种动态分配解决方案(函数指针表等)将无法实现。

尽管您的问题明确地是关于将数据传递到着色器中的,但我也要指出,如果控制分支的值以统一的方式传递到着色器中,则可以改为编译着色器的多个变体,然后从应用程序本身动态选择合适的一个(即使用正确的缓动功能的选择)。这样可以节省着色器中分支的成本。