Arrays WEBGL 1.0着色器:什么&x27;如果可以的话,使用数组的意义何在;不使用变量来计算索引吗?

Arrays WEBGL 1.0着色器:什么&x27;如果可以的话,使用数组的意义何在;不使用变量来计算索引吗?,arrays,glsl,shader,webgl,glsles,Arrays,Glsl,Shader,Webgl,Glsles,在本例中,使用数组的目的是计算索引并获取该索引的内容。如果我必须使用常数,我将如何计算索引? (顺便说一句,在我的情况下,使用纹理作为输入是没有效率的)。请参阅: 以下是常数索引表达式: 恒定表达式 第4节中定义的循环索引 由上述两个表达式组成的表达式 因此,数组的索引也可以是for循环的控制变量: for(int i=0;i

在本例中,使用数组的目的是计算索引并获取该索引的内容。如果我必须使用常数,我将如何计算索引? (顺便说一句,在我的情况下,使用纹理作为输入是没有效率的)。

请参阅:

以下是常数索引表达式:

  • 恒定表达式
  • 第4节中定义的循环索引
  • 由上述两个表达式组成的表达式
因此,数组的索引也可以是for循环的控制变量:

for(int i=0;i<2;i++)
{
浮点数tst=s[i].x;
// [...]
}

应该提到的是,该限制适用于(WebGL 1.0),但不适用于(WebGL 2.0)

见:

对于GLSL ES 1.00,没有强制要求支持数组、向量和矩阵的动态索引,因为某些实现不直接支持它。软件解决方案(通过程序转换)适用于一部分情况,但会导致性能不佳。GLSL ES 3.00是否应强制要求支持动态索引

解决方案:强制支持数组的动态索引,但取样器数组、片段输出数组和统一块数组除外


好的,谢谢,这是一个有效的用法,这是唯一的情况吗?我这样问是因为我的目标是最小化或完全消除循环以提高效率。现在,如果效率相同,那么我打赌循环被展开并转换为基于常数的代码,对吗?确切地说-
GLSL ES 100
限制被定义为允许琐碎的循环展开,因为当时GPU硬件无法做其他事情。好吧,很高兴知道,除了通过基本循环进行索引,不允许进行索引计算。@dllb还请注意,此限制仅适用于GLSL ES 1.0。GLSL ES 3.00要宽容得多。@rabbi76我知道,但不幸的是,IOS还不支持WEBGL 2.0(IOS上的Safari),所以我不能排除所有苹果智能手机。它可能看起来很奇怪,但
GLSL ES 100
不允许计算数组索引,但允许使用if/else语句以笨拙的方式在逻辑上做同样的事情(例如,
if(dist==0){tst=s[0].x;}else{tst=s[1].x;}
)(我刚刚看到你的评论),这就是我几分钟前的想法,他们不允许简单的内存读取(数组),而允许“if-then-else”,这可能对性能(并行计算)有更大的影响,这是我书中糟糕的规范设计。。。
    vec2 s[5];
    s[1] = vec2(0.0, 0.1);
    s[2] = vec2(0.5, 0.8);
    int dist = 0;
    dist++;
    float tst = s[dist].x;