GLSL:如何做类似开关的语句

标签 glsl shader

我想根据传入着色器的数据动态调用缓动。所以在伪代码中:

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

我想知道在 GLSL 中完成此任务的最佳方法。我可以以某种方式使用 switch 语句,或者可以将 easings 放入数组中并像那样使用它们。或者也许有一种方法可以创建哈希表并像上面的示例一样使用它。

easingsArray = [
  cubicIn,
  cubicOut,
  ...
]

uniform easingId

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

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

最佳答案

如果您需要在 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 不支持函数指针,因此您正在考虑的那种动态调度解决方案(函数指针表等)很遗憾是不可能的。

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

关于GLSL:如何做类似开关的语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55173683/

相关文章:

iOS:应用内购买中的 GLSL

c++ - OpenGL 4.0 Shading Language Cookbook 中的第一个示例

javascript - 如何将着色器添加到从 OBJMTLLoader 加载的 THREE.Object3D

glsl - 着色器中的平铺纹理

opengl-es-2.0 - 使用着色器创建模糊滤镜 - 从片段着色器访问相邻像素?

opengl - glsl 和 opencl 中的钳位函数如何工作?它使用创建分支吗?我应该避免使用它吗?

c++ - OpenGL-QT : Mouse move event effects is not showing up

three.js - 将 GLSL 3 ES 与 Three.js 结合使用

c++ - 当我传递纹理坐标 (OpenGL) 时没有任何显示

opengl-es - 如何以编程方式切换到 Sprite Kit 中的 openGL 以适应 iPad2 等旧设备