Android OpenGL ES 2.0:三星Galaxy S2上的GLSL片段着色器是否可以使用"switch-case"语法?

Nav*_*eur 9 android opengl-es glsl fragment-shader

有人知道如何switch case在三星Galaxy S2上的片段着色器中进行语法处理吗?我得到编译错误:Expected literal or '(', got 'switch'.

我的语法如下:

switch(i){
    case 0: x = alphas[0]; break;
    case 1: //...etc.
}
Run Code Online (Sandbox Code Playgroud)

这在Nexus 7上工作正常,但在Galaxy S2上我得到了上述错误.是否switch case说明根本不可能在Galaxy S2?我想要使​​用它们的原因是它们似乎比if elseNexus 7 提供了性能提升.如果它们在Galaxy S2上是不可能的,有没有办法查询设备并使用(switch case如果可用),if else否则?

Kim*_*imi 8

switchOpenGL ES 2.0不支持该语句.从OpenGL ES着色语言1.0.17规范3.7:

以下是保留供将来使用的关键字.使用它们将导致错误:

asm类union enum typedef模板这个打包的goto 开关默认...


zom*_*mbo 6

GLSL ES基于桌面GLSL的1.10版本,但是在版本1.30中添加了"switch case"语句,因此您不能假设设备会支持它.

此外,我建议避免片段着色器中的分支,因为它严重打击了perfomanace.

  • 您可以尝试为不同的对象类型(不使用_switch_,使用适当的_case_内联代码)准备不同的着色器,并在绘制之前调用glUseProgram(GLint aObjectShaderID),类型更改时.这就是我现在使用的,加速取决于我必须更改着色器的频率(要绘制的对象应该通过着色器进行排序以最小化着色器更改)以及分支的复杂程度,但是黄金法则是不惜一切代价避免分支实现每个优化. (4认同)
  • @Navigateur - 我可以支持zombo对优化的直觉.在我看到的几乎所有情况下,在移动设备上,额外绘制调用的小开销大大抵消了在着色器中删除分支的性能提升.在片段着色器中删除分支时,我看到了10-20倍的加速. (2认同)