我想知道为什么我不能使用整数索引初始化数组。在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);
}
有什么想法吗?
答案 0 :(得分:2)
问题是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,它只是猜测了一些方法。也许它会以两种方式编译着色器,而无论哪种方法都可以使用。我不知道,我只知道它同时支持两者。