OpenGL ES 2.0中的统一数组中的片段着色器读取值

时间:2014-12-20 12:54:35

标签: 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 (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];
  }
}

这很有效,但令人惊讶的是性能仍然相当不错,但它显然不太理想。

我做错了什么或者这是GPU驱动程序/编译器中的错误?我有什么有效的替代品?

1 个答案:

答案 0 :(得分:2)

GLSL ES 1.00 spec

OpenGL ES 2.0有这一行:

  

制服(不包括采样器)

     

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

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