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



我有一个片段着色器,可以将颜色下采样为 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 驱动程序/编译器中的错误?我有哪些有效的替代方案?

OpenGL ES 2.0规范的GLSL ES 1.00有这样一行:

制服(不包括采样器(

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

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

最新更新