Opengl es OpenGL ES 2.0中均匀数组中的片段着色器读取值

Opengl es OpenGL ES 2.0中均匀数组中的片段着色器读取值,opengl-es,fragment-shader,uniform,glsles,Opengl Es,Fragment Shader,Uniform,Glsles,我有一个片段着色器,它可以将颜色的采样减少到4种不同的颜色。 为此,我计算了一个基于颜色的索引,颜色从0到3不等。 然后,我在vec4的统一数组中查找最终颜色的值: 数组的声明: uniform vec4 u_colors[4]; 查找: gl_FragColor = u_colors[int(index)]; 这在某些设备上运行良好,但在某些设备上(例如Tegra 4),我似乎无法使用变量访问数组,并且输出是垃圾。我发现的唯一解决办法是: index = floor(index); if

我有一个片段着色器,它可以将颜色的采样减少到4种不同的颜色。 为此,我计算了一个基于颜色的索引,颜色从0到3不等。 然后,我在vec4的统一数组中查找最终颜色的值:

数组的声明:

uniform vec4 u_colors[4];
查找:

gl_FragColor = u_colors[int(index)];
这在某些设备上运行良好,但在某些设备上(例如Tegra 4),我似乎无法使用变量访问数组,并且输出是垃圾。我发现的唯一解决办法是:

index = floor(index);
if (index < 2.0) {
  if (index == 0.0) {
    gl_FragColor = u_colors[0];
  } else {
    gl_FragColor = u_colors[1];
  }
} else {
  if (index == 2.0) {
    gl_FragColor = u_colors[2];
  } else {
    gl_FragColor = u_colors[3];
  }
}
index=楼层(索引);
如果(指数<2.0){
如果(指数=0.0){
gl_FragColor=u_颜色[0];
}否则{
gl_FragColor=u_颜色[1];
}
}否则{
如果(指数=2.0){
gl_FragColor=u_颜色[2];
}否则{
gl_FragColor=u_颜色[3];
}
}
这是可行的,令人惊讶的是,性能仍然很好,但显然并不理想


我是否做错了什么,或者这是GPU驱动程序/编译器中的错误?我有哪些有效的替代方案?

GLSL ES 1.00
对于
OpenGL ES 2.0
有以下几行:

制服(不包括采样器)

在顶点着色器中,支持所有形式的数组索引 授权的。在片段着色器中,仅支持索引 强制用于常量索引表达式

大多数驱动程序在片段着色器中实现此功能,但这不是必需的,因此Tegra 4有权拒绝接受您的代码