在 webgl 中设置制服
Setting uniforms in webgl
任何人都可以解释或指出正确的方向来很好地解释用于设置统一值的不同函数。在作弊 sheet here 中我们得到这个:
void uniform[1234][fi](uint location, ...)
void uniform[1234][fi]v(uint location, Array value)
void uniformMatrix[234]fv(uint location, bool transpose, Array)
但我想知道它们各自在做什么以及 f 和 i 的用途。
这不是很难理解。
方括号内的值是指变量的维度和数据类型。所以你有以下列表
- 1 - 一个值
- 2 - 两个值
- 3 - 三个值
- 4 - 四个值
- f - 你的数据是一个浮点数
- i - 你的数据是一个整数
- v - 你的数据指的是一个数组
在 WebGL 规范中有更多相关信息。
1234
= 维度
f
= 浮动
i
= 整数
v
最后一个字符(如果存在)是 v,
指示该命令采用值数组(向量)而不是
比一系列单独的论点
对于非数组 uniform,v
和 non v
版本的 uniform 函数之间的唯一区别在于您如何向其提供数据:
uniform1fv(loc,[3.14159])
对比 uniform1f(loc,3.14159)
.
uniform3fv(loc,[.5,1.,.5])
对比 uniform3f(loc,.5,1.,.5)
但对于统一数组,您可以使用 v
函数设置整个数组
在着色器中
uniform float someArray[10];
在 js 中
// at init time
var location = gl.getUniformLocation(prg, "someArray");
// at render time
var arrayWith10Values = [5, 4, 1, 3, 4, 5, 12, 0.1, 2, -1];
gl.uniform1fv(location, arrayWith10Values);
要使用非 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...
任何人都可以解释或指出正确的方向来很好地解释用于设置统一值的不同函数。在作弊 sheet here 中我们得到这个:
void uniform[1234][fi](uint location, ...)
void uniform[1234][fi]v(uint location, Array value)
void uniformMatrix[234]fv(uint location, bool transpose, Array)
但我想知道它们各自在做什么以及 f 和 i 的用途。
这不是很难理解。
方括号内的值是指变量的维度和数据类型。所以你有以下列表
- 1 - 一个值
- 2 - 两个值
- 3 - 三个值
- 4 - 四个值
- f - 你的数据是一个浮点数
- i - 你的数据是一个整数
- v - 你的数据指的是一个数组
在 WebGL 规范中有更多相关信息。
1234
= 维度
f
= 浮动
i
= 整数
v
最后一个字符(如果存在)是 v,
指示该命令采用值数组(向量)而不是
比一系列单独的论点
对于非数组 uniform,v
和 non v
版本的 uniform 函数之间的唯一区别在于您如何向其提供数据:
uniform1fv(loc,[3.14159])
对比 uniform1f(loc,3.14159)
.
uniform3fv(loc,[.5,1.,.5])
对比 uniform3f(loc,.5,1.,.5)
但对于统一数组,您可以使用 v
函数设置整个数组
在着色器中
uniform float someArray[10];
在 js 中
// at init time
var location = gl.getUniformLocation(prg, "someArray");
// at render time
var arrayWith10Values = [5, 4, 1, 3, 4, 5, 12, 0.1, 2, -1];
gl.uniform1fv(location, arrayWith10Values);
要使用非 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...