这是在GLSL 1.0中使用非常量索引访问数组元素的最佳方法吗?

这是在GLSL 1.0中使用非常量索引访问数组元素的最佳方法吗?,glsl,webgl,Glsl,Webgl,我需要根据1.0规范编写,这样我也可以在WebGL 1.0上运行。 我提出了以下帮助函数 问题1:这是最好的办法吗?还有更具创造性的方法吗?(注意:在编译源代码时,我有统一代码的总长度,我可以将其注入源代码中。但是,在编写逻辑时,我不知道我在处理什么,所以我不能使用vec4或类似的东西) 问题2:如果我不使用统一的数组,而是使用纹理,那么对于大小为1-10的纹理,创建纹理的效率会是多少?然后使用texture2D()调用访问元素 precision mediump float; 可变vec4颜色

我需要根据1.0规范编写,这样我也可以在WebGL 1.0上运行。 我提出了以下帮助函数

问题1:这是最好的办法吗?还有更具创造性的方法吗?(注意:在编译源代码时,我有统一代码的总长度,我可以将其注入源代码中。但是,在编写逻辑时,我不知道我在处理什么,所以我不能使用vec4或类似的东西)

问题2:如果我不使用统一的数组,而是使用纹理,那么对于大小为1-10的纹理,创建纹理的效率会是多少?然后使用texture2D()调用访问元素

precision mediump float;
可变vec4颜色;
均匀浮动α[5];
float getItem(float[5]a,int索引){

对于(int i=0;i根据规范,GLSL ES v1.0应支持统一数组的动态索引。为什么不使用
array[index]
对统一数组进行采样


关于纹理,如果数据的大小很小,则不如使用制服有效,尤其是在应用程序运行时需要更改数据的情况下。

关于为什么要使用纹理的另一个示例。
float elem=texture2D(arrayTexture,vec2(.5+索引)/textureWidth,0)).r;
纹理对于1到10这样的小尺寸是否合适?我很乐意创建它们,因为它们全面简化了我的代码,但不确定这是否真的有效。刚刚在Firefox中做了这个简单的测试,有一个错误告诉我“索引表达式必须是常量”:“精度mediump float;统一float M[4];variabling vec4 vColor;void main(void){int i=1;float k=M[i*2];gl_FragColor=vColor;}`Yep,因为索引包括乘法。可以重写代码而不需要使用它。
precision mediump float;
varying vec4 vColor;
uniform float alpha[5];
float getItem(float[5] a, int index) {
    for(int i=0; i<5;i++) {
        if(i==index) return a[i];
    }
}
void main(void) {
    float c = getItem(alpha, i+1);
    gl_FragColor = vColor;
}