在WebGL中将大型数组传递给统一

Lan*_*ard 2 arrays webgl

想知道是否可以将大型数组传递给WebGL着色器,如下所示:

// array here
uniform vec4[huge] mydynamicarray;

void main() {
  // iterate through the array here to perform processing on it,
  // then write value to gl_Position
  gl_Position = ...;
}
Run Code Online (Sandbox Code Playgroud)

然后将这样填充:

gl.uniform4fv(myarrayloc, myarray)
Run Code Online (Sandbox Code Playgroud)

我已经看到了许多如何传递这样的值的示例,例如:

gl.uniform4fv(offsetLoc, [1, 0, 0, 0])
Run Code Online (Sandbox Code Playgroud)

但是我还没有看到是否可以传递一个很大的,动态大小的数组。

这样做的原因是您可以处理2个数组:

  1. 一种是在WebGL中并行运行的向量数组。
  2. 一个就是可以为每个向量迭代的统一数组。

gma*_*man 5

大多数WebGL实现的限制为1024个或更少的统一向量

换句话说huge,不能大于1024 vec4s或特定GPU的限制。还要注意,基于规范中指定的统一打包规则,这也意味着最大的float统一数组也为1024或特定GPU的限制。

您可以声明数组

uniform vec4 foo[3];
Run Code Online (Sandbox Code Playgroud)

并设置它们的值

gl.uniform4fv(fooLoc, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]);
Run Code Online (Sandbox Code Playgroud)

纹理是将大量随机访问数据传递到WebGL中的方式这个答案可能是有意义的