首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >无法在WebGL/GLSL中初始化具有整数索引的矢量数组?

无法在WebGL/GLSL中初始化具有整数索引的矢量数组?
EN

Stack Overflow用户
提问于 2019-06-11 03:17:21
回答 1查看 1.2K关注 0票数 0

我想知道为什么我不能初始化一个具有整数索引的数组。在shader玩具中,它似乎可以工作,但当我通过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);
}

有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-11 11:12:34

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

See the spec

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 has a WebGL2 version

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56532320

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档