我有一个片段着色器,可以将颜色下采样为 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 有权拒绝接受你的代码。