在WebGL中设置uniforms

3
有人能解释一下,或者指导我一个好的解释不同函数用于设置统一值的方法吗?在这个速查表这里,我们得到了以下内容: 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是什么意思。

当然。作为一个卑微的JavaScript开发者,浮点数和整数并不是我关注的重点。我猜v指的是向量,但为什么uniformMatrix上会有v,而且你为什么能够创建只有一个维度的uniform1fv呢?这不就等同于uniform1f吗? - adamdaly
我已经将我的评论合并为一个答案。 - LJᛃ
这个对你有帮助吗?http://webglfundamentals.org/webgl/lessons/webgl-shaders-and-glsl.html - gman
2个回答

11

1234 = 尺寸

f = 浮点数

i = 整数

v 如果出现在最后一个字符,表示该命令接受一组值(向量)而不是一系列单独的参数

对于非数组uniform,vnon v版本的uniform函数之间唯一的区别就是如何向其提供数据:

uniform1fv(loc,[3.14159])uniform1f(loc,3.14159) 的唯一区别在于:

uniform3fv(loc,[.5,1.,.5])uniform3f(loc,.5,1.,.5) 的唯一区别在于:

但对于数组uniform,您可以使用v函数设置整个数组

在着色器中

uniform float someArray[10];

在JavaScript中

// 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...

谢谢,我现在明白了。 - adamdaly
1
感谢这句话:“要使用非 v 函数实现这一点,您必须查找每个位置”。 - Wezelkrozum

5
方括号中的值指的是变量的维数和数据类型。因此,您有以下列表:
  • 1 - 一个值
  • 2 - 两个值
  • 3 - 三个值
  • 4 - 四个值
  • f - 您的数据是浮点数
  • i - 您的数据是整数
  • v - 您的数据是一个数组
在WebGL规范中有更多相关信息。

谢谢回复。 - adamdaly
3
我投了反对票。请考虑删除“这不是很难理解”的陈述。 - AndreaBogazzi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接