我有一个片段着色器,可以将颜色下采样到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驱动程序/编译器中的错误?我有什么有效的替代品?
答案 0 :(得分:2)
GLSL ES 1.00
spec的 OpenGL ES 2.0
有这一行:
制服(不包括采样器)
在顶点着色器中,支持所有形式的数组索引 授权。在片段着色器中,仅支持索引 强制要求使用常量索引表达式。
大多数驱动程序在片段着色器中实现此功能,但这不是必需的,因此Tegra 4拥有拒绝接受您的代码的所有权利。