Javascript 在webgl中设置制服

Javascript 在webgl中设置制服,javascript,opengl-es,webgl,Javascript,Opengl Es,Webgl,有谁能给我解释一下,或者给我指出一个正确的方向,好的解释用来设置统一值的不同函数。在备忘单中,我们可以看到: void uniform[1234][fi](uint位置,…) 无效统一[1234][fi]v(uint位置,数组值) void uniformMatrix[234]fv(单元位置、布尔转置、数组) 但我想知道每一个都在做什么,f和i是用来做什么的。这并不难理解 方括号内的值表示变量的维度和数据类型。所以你有下面的清单 1-一个值 2-两个值 3-三个值 4-四个值 f-您的数据是一

有谁能给我解释一下,或者给我指出一个正确的方向,好的解释用来设置统一值的不同函数。在备忘单中,我们可以看到:

void uniform[1234][fi](uint位置,…)
无效统一[1234][fi]v(uint位置,数组值)
void uniformMatrix[234]fv(单元位置、布尔转置、数组)


但我想知道每一个都在做什么,f和i是用来做什么的。

这并不难理解

方括号内的值表示变量的维度和数据类型。所以你有下面的清单

  • 1-一个值
  • 2-两个值
  • 3-三个值
  • 4-四个值
  • f-您的数据是一个浮点值
  • 你的数据是一个整数
  • v-您的数据引用一个数组

在WebGL规范中有更多关于这方面的信息。

1234
=尺寸

f
=float

i
=整数

v
最后一个字符(如果存在)是v, 指示命令采用值的数组(向量),而不是 而不是一系列单独的论点

对于非均匀阵列,均匀函数的
v
non-v
版本之间的唯一区别在于如何向其提供数据:

uniform1fv(loc,[3.14159])
vs
uniform1f(loc,3.14159)

uniform3fv(loc,[5,1,5])
vs
uniform3f(loc,.5,1,5)

但是对于均匀阵列,可以使用
v
函数设置整个阵列

在着色器中

uniform float someArray[10];
在js中

要使用非
v
函数实现这一点,您必须查找每个位置

var location0 = gl.getUniformLocation(prg, "someArray[0]");
var location1 = gl.getUniformLocation(prg, "someArray[1]");
var location2 = gl.getUniformLocation(prg, "someArray[2]");
var location3 = gl.getUniformLocation(prg, "someArray[3]");
var location4 = gl.getUniformLocation(prg, "someArray[4]");
...etc...

gl.uniform1f(location0, value0);
gl.uniform1f(location1, value1);
gl.uniform1f(location2, value2);
gl.uniform1f(location3, value3);
gl.uniform1f(location4, value4);
...etc...

当然作为一个低级javascript开发人员,浮点数和整数并不在我的脑海中。我猜v是指向量,但为什么在uniformMatrix上会有一个v,为什么你能创建一个只有一维的uniform1fv。这和uniform1f不一样吗?我已经把我的评论合并成了一个答案,这有帮助吗?谢谢,我现在明白了。谢谢你的回复。
var location0 = gl.getUniformLocation(prg, "someArray[0]");
var location1 = gl.getUniformLocation(prg, "someArray[1]");
var location2 = gl.getUniformLocation(prg, "someArray[2]");
var location3 = gl.getUniformLocation(prg, "someArray[3]");
var location4 = gl.getUniformLocation(prg, "someArray[4]");
...etc...

gl.uniform1f(location0, value0);
gl.uniform1f(location1, value1);
gl.uniform1f(location2, value2);
gl.uniform1f(location3, value3);
gl.uniform1f(location4, value4);
...etc...