无法初始化具有 WebGL/GLSL 中的整数索引的向量数组



我想知道为什么我不能用整数索引初始化数组。在着色器中,它似乎可以工作,但是当我通过三个.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,它只是猜测一些方法。也许它以两种方式编译着色器,无论哪种方式有效,它都会使用着色器。我不知道,我只知道它确实支持两者。

三.js有一个WebGL2版本

最新更新