【问题标题】:WebGL - Looping through an array in a shaderWebGL - 在着色器中循环遍历数组
【发布时间】:2018-01-03 22:43:58
【问题描述】:

我想知道我应该如何从着色器循环遍历数组。 我已经阅读了很多东西,但我仍然很困惑。

这里是创建数组的 JavaScript:

var particles = []; // I'm creating an array of x and y coordinates
for (var i = 0; i < 100; i++) {
    particles.push([
            Math.floor(Math.random()*1000) + .5, 
            Math.floor(Math.random()*1000) + .5
        ]);
}
gl.uniform2fv(gl.getUniformLocation(glProgram, 'particles'), particles);

这是我的片段着色器的一部分:

uniform vec2 particles;

void main( void ) {
    bool found = false;
    for (int i = 0; i < 100; i ++) {
        if (particles[i].x == 1.0) {
            found = true;
        }
    }
}

我得到的错误是“字段选择需要左侧的结构或向量”。 我错过了什么?

【问题讨论】:

  • 不太了解WebGL,但我猜你在shader中声明particles不正确,应该是uniform vec2 particles[100];
  • 你是对的。你为我节省了很多时间,谢谢!
  • 仅供参考:当然可以随心所欲,但鉴于最小最大尺寸为 128,使用大型制服数组并不常见。这意味着如果您声明uniform vec2 particles[129],那么哪里会有很多 GPU 可以' t 运行着色器,因为它们支持的最大数组大小为 128。(当前1 of 4 will fail)通常,如果您需要随机访问数据,则将该数据放入纹理中。
  • 通过这个问题,但没有额外的上下文,您的代码让我感觉您可能想要重新组织您的数据,以便在着色器步骤之前知道哪些点的 .x 为 1.0。您可以创建单独的缓冲区。这样你就可以避免线性搜索。

标签: javascript webgl


【解决方案1】:

着色器中particles 的声明不正确,它定义了一个vec2 而不是vec2 的数组。

正确的声明是:

uniform vec2 particles[100];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-04
    • 1970-01-01
    • 2019-07-10
    • 1970-01-01
    • 2012-05-24
    • 2016-05-25
    相关资源
    最近更新 更多