WEBGL 1.0 着色器:如果我不能使用变量来计算索引,那么使用数组有什么意义?

问题描述

    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;

The above test raises this error:

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

解决方法

OpenGL ES Shading Language 1.00 Specification - Appendix A - Indexing of Arrays,Vectors and Matrices

以下是常量索引表达式:

  • 常量表达式
  • 第 4 节中定义的循环索引
  • 由以上两者组成的表达式

因此,数组的索引也可以是for循环的控制变量:

for (int i = 0; i < 2; i++)
{
    float tst = s[i].x;

    // [...]
}

应该指出的是,此限制适用于 OpenGL ES Shading Language 1.00 (WebGL 1.0),但不适用于 OpenGL ES Shading Language 3.00 (WebGL 2.0)。

OpenGL ES Shading Language 3.00 Specification - 12.30 Dynamic Indexing

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

解决方案:强制支持对除采样器数组、片段输出数组和统一块数组之外的数组进行动态索引。