在 webgl 中设置制服

ada*_*aly 3 javascript opengl-es webgl

任何人都可以解释或指出我正确解释用于设置统一值的不同函数的正确方向。在此处的备忘单中我们得到了这个:

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 的用途。

LJᛃ*_*LJᛃ 7

1234 = 尺寸

f = 浮动

i = 整数

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

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

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

uniform3fv(loc,[.5,1.,.5]) 对比 uniform3f(loc,.5,1.,.5)

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

在着色器中

uniform float someArray[10];
Run Code Online (Sandbox Code Playgroud)

在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);
Run Code Online (Sandbox Code Playgroud)

要使用非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...
Run Code Online (Sandbox Code Playgroud)


Dan*_*gel 5

方括号内的值指的是变量的维度和数据类型。所以你有以下列表

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

WebGL 规范中有更多相关信息。

  • 我投了反对票。请考虑删除“这不是很难理解”的陈述。 (3认同)