无法在WebGL / GLSL中使用整数索引初始化矢量数组?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (10)

我想知道为什么我不能用整数索引初始化数组。在shadertoy它似乎可以,但当我通过three.js使用这个像素着色器时,它不起作用:

void main(void) {
    vec2 p[1];
    p[0] = vec2(0.0, 0.0); // works

    int i = 0;
    p[i] = vec2(0.0, 0.0); // doesn't work glsl doesn't run

    gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
}

有任何想法吗?

提问于
用户回答回答于

问题是GLSL 1.0仅支持基于常量整数表达式的数组轴或循环的常量整数表达式。

请参阅规格

void main(void) {
    vec2 p[1];
    p[0] = vec2(0.0, 0.0); // works

    int i = 0;
    p[i] = vec2(0.0, 0.0); // doesn't work. i is not constant

    const int j = 0;
    p[j] = vec2(0.0, 0.0); // works

    vec2 q[2];
    for (int k = 0; k < 2; ++k) {  // 2 is a constant int so this works
       p[k] = vec2(0); // works
    }

    gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
}

请注意,规则很复杂。例如,您的代码在顶点着色器中没有问题,但在片段着色器中没有。除了顶点着色器中的采样器数组之外,索引必须遵循相同的限制规则。

WebGL2支持GLSL ES 3.00,允许在更多地方进行非常量整数数组访问。

Shadertoy可选择使用WebGL2,尽管它试图自动魔术。您不必告诉它您的着色器使用的是GLSL ES 3.0,它只是猜测了一些方法。也许它以两种方式编译着色器,无论哪一种都可以使用它。我不知道,我只知道它确实支持两者。

THREE.js有一个WebGL2版本

扫码关注云+社区

领取腾讯云代金券