在 WebGL 中将大数组传递给统一
Passing large array into uniform in 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 = ...;
}
然后它将像这样填充:
gl.uniform4fv(myarrayloc, myarray)
我看过很多examples这样的传值方法,比如:
gl.uniform4fv(offsetLoc, [1, 0, 0, 0])
但我还没有看到是否可以传入一个非常大的、动态大小的数组。
这样做的原因是您可以处理 2 个数组:
- 一个是WebGL中并行的向量数组运行。
- 一个是统一数组,您可以为每个向量迭代它。
Most WebGL implementations have a limit of 1024 or less uniform vectors
换句话说,huge
不能大于 1024 个 vec4 或任何特定 GPU 的限制。另请注意,根据规范中指定的统一打包规则,这也意味着最大的浮点统一数组也是 1024 或任何特定 GPU 的限制。
你可以声明数组
uniform vec4 foo[3];
并设置它们的值
gl.uniform4fv(fooLoc, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]);
纹理是将大量随机访问数据传递到 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 = ...;
}
然后它将像这样填充:
gl.uniform4fv(myarrayloc, myarray)
我看过很多examples这样的传值方法,比如:
gl.uniform4fv(offsetLoc, [1, 0, 0, 0])
但我还没有看到是否可以传入一个非常大的、动态大小的数组。
这样做的原因是您可以处理 2 个数组:
- 一个是WebGL中并行的向量数组运行。
- 一个是统一数组,您可以为每个向量迭代它。
Most WebGL implementations have a limit of 1024 or less uniform vectors
换句话说,huge
不能大于 1024 个 vec4 或任何特定 GPU 的限制。另请注意,根据规范中指定的统一打包规则,这也意味着最大的浮点统一数组也是 1024 或任何特定 GPU 的限制。
你可以声明数组
uniform vec4 foo[3];
并设置它们的值
gl.uniform4fv(fooLoc, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]);
纹理是将大量随机访问数据传递到 WebGL 的方式。