如何将没有固定大小的数组传递到顶点着色器中



我的.js文件中有一个没有固定大小的数组(let noise = [];(,它存储了一个点(noise[i]->单个点(的噪声值。

我想知道我是否能够通过以下操作将数组中的所有值传递到我的顶点着色器中:

//.js
for(let i = 0; i < noise.length; i++) {
const uNoise = gl.getUniformLocation(program, "uNoise[" + i + "]");
gl.uniform3fv(uNoise, MV.flatten(noise[i]));
}
//vertex.shader
let uNoise[];

如果没有,怎么可能做到呢?

聚合到数组中的统一的位置是升序的。所以你可以简单地做:

const uNoise = gl.getUniformLocation(program, "uNoise");
gl.uniform1f(uNoise, new Float32Array(MV.flatten(noise)));

在着色器中不可能将可变大小的数组作为统一数组。您可以做的是分配一个固定大小的数组,该数组表示您的最大元素数,然后发送一个与实际元素计数一致的额外整数。

uniform int numElements;
uniform float noise[1024];

您可以使用此技术对值进行迭代(如果需要的话(。

另一种方法是将值放在纹理中并从中采样,如果这真的只是噪波,那么你可能想要一个简单的噪波纹理,它一开始就包裹起来,因为在着色器中使用它会更舒适,在这一点上,另一种选择是使用同构的伪随机函数,当你输入相同的数据时,你可以在CPU和GPU上运行该函数来接收相同的输出。