GLSL:如何做类似switch的语句

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

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

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

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

easingsArray = [
  cubicIn,
  cubicOut,
  ...
]

uniform easingId

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

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

glsl shader
1个回答
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不支持函数指针,因此遗憾的是,您正在考虑的动态调度解决方案(函数指针表等)是不可能的。

虽然您的问题明确是关于数据传递到着色器,但我还想指出,如果控制分支的值作为统一传递到着色器,那么您可以编译着色器的多个变体,然后从应用程序本身动态选择正确的(即使用正确的缓动函数的那个​​)。这样可以节省着色器中分支的成本。

© www.soinside.com 2019 - 2024. All rights reserved.