【问题标题】:Fragment shader reading value in uniform array in OpenGL ES 2.0OpenGL ES 2.0 中统一数组中的片段着色器读取值
【发布时间】:2014-12-20 12:54:35
【问题描述】:

我有一个片段着色器,可以将颜色下采样为 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 fragment-shader uniform glsles


    【解决方案1】:

    GLSL ES 1.00 for OpenGL ES 2.0 spec 有这行:

    制服(不包括采样器)

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-20
      • 1970-01-01
      相关资源
      最近更新 更多