在 WebGL 程序中使用 uniform[1234][uif] 设置制服:矢量版本 [v] 在任何方面都更好吗?

Set uniforms using uniform[1234][uif] in a WebGL program: is the vector version [v] better in any regard?

是否有任何重要的 advantage/disadvantage 使用 uniform[1234][uif][v] 和类似类型的数组设置 WebGL 程序的制服,而不是仅使用 uniform[1234][uif] + 传播参数,例如。 :

gl.uniform3f (location, v0, v1, v2);   // GLSL type: vec3
// vs
gl.uniform3fv(location, [v0, v1, v2]); // GLSL type: vec3 (or vec3[] array)

显然忽略了一个版本的方法处理数组的事实。

我正在寻找性能、可读性和整体最佳实践方面的考虑因素。

谢谢!

我认为你应该做任何你想做的事。我的意思是很难提出哪个更好,因为它在很大程度上取决于您的个人编码偏好。

假设您制作了这样一个向量

 const v = {x: 1, y: 2, z: 3}

现在需要将它与 gl.uniform 一起使用时,您可以执行以下任一操作

 gl.uniform3f(loc, v.x, v.y, v.z);
 gl.uniform3fv(loc, [v.x, v.y, v.z]);

在那种情况下,第一个更好,因为每次执行该行时,第二个都会创建一个新数组。

另一方面,如果您创建这样的矢量

 const v = [1, 2, 3];

然后

 gl.uniform3f(loc, v[0], v[1], v[2]);
 gl.uniform3fv(loc, v);

显然第二个更好。

有了 ES5,你还有一个选择,那就是

 gl.uniform3f(loc, ...v);

我不知道这比 gl.uinform3fv(loc, v) 快还是慢。我怀疑今天速度较慢,但​​将来可能是相同的速度。既然你有 gl.uinform3fv 真的没有理由使用那种风格。尽管没有采用数组的格式,但它对其他函数很有用。例子

 const color = [1, 0, 0, 1];

 gl.clearColor(...color);

数组版本本身稍慢。引用 WebGL insights(第 19 页),

For example, comparing uniform4f to uniform4fv instead of uniform1f, we found that uniform4fv is slower than uniform4f in all browsers that we tried, despite taking as few parameters as uniform1f does. This is due to uniform4fv having inherently more work to do than uniform4f, since it can handle arbitrary uniform array uploads.

基本上,必须检查输入是否为数组(然后检查其元素类型)、类型化数组等会失去因传递较少参数而获得的性能。

然而,这主要意味着您应该使用与您的数据相匹配的任何一个,因为解压缩现有数组可能会超过好处(不过请随意测试)。