无法用 WebGL/GLSL 中的整数索引初始化向量数组?
Cannot initialize a vector array with an integer index in WebGL/GLSL?
我想知道为什么我不能用整数索引初始化数组。在 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 仅支持数组轴的 constant 整数表达式或基于 constant 整数表达式的循环。
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,它允许 non-constant 在更多地方访问整数数组。
Shadertoy 可以选择使用 WebGL2,尽管它尝试这样做 auto-magically。您不必告诉它您的着色器正在使用 GLSL ES 3.0,它只是猜测一些方式。也许它会以两种方式编译着色器,无论哪种方式,它都使用它。我不知道,我只知道它确实支持两者。
我想知道为什么我不能用整数索引初始化数组。在 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 仅支持数组轴的 constant 整数表达式或基于 constant 整数表达式的循环。
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,它允许 non-constant 在更多地方访问整数数组。
Shadertoy 可以选择使用 WebGL2,尽管它尝试这样做 auto-magically。您不必告诉它您的着色器正在使用 GLSL ES 3.0,它只是猜测一些方式。也许它会以两种方式编译着色器,无论哪种方式,它都使用它。我不知道,我只知道它确实支持两者。