如何在WebGL中使用getActiveUniform

时间:2014-03-10 17:59:11

标签: javascript webgl

我试图调试我的制服在WebGL中无法正常工作的问题,并找到了getActiveUniform,它返回了有关制服(包括名称)的一些信息。 签名是(根据规范):

WebGLActiveInfo? getActiveUniform(WebGLProgram? program, GLuint index);

我惊讶地发现它首先为所有制服返回了相同的名称,但后来我再次查看了签名,并意识到它需要一个整数作为第二个参数,如果我手动将其更改为0,1, 2等它给了制服。不幸的是,你从getUniformLocation获得的是一个不透明的对象。

这是规范中的疏忽,还是实际上有某种方法可以正确调用此功能? (因为我找不到任何东西)。

1 个答案:

答案 0 :(得分:3)

我有点不清楚你在问什么,但我认为它是“什么是getUniformLocation有用?”

如果代码不知道它们是什么(任何类型的元编程),那么对所有制服做一些事情很有用。

例如,我这样使用它:

var uniforms = {};
for (var i = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS) - 1; i >= 0; i--) {
  var name = gl.getActiveUniform(program, i).name;
  uniforms[name] = gl.getUniformLocation(program, name);
}

然后使用uniforms对象,我可以编写这样的代码,不需要任何额外的GL调用,也不必在着色器本身的任何地方声明统一变量:

gl.uniformMatrix4fv(uniforms.uPMatrix, false, pMatrix);
gl.uniform1f(uniforms.uFogDistance, fogDistance);

使用getActiveAttribgetAttribLocation以相同的方式使用attrib可以做同样的事情。