我试图调试我的制服在WebGL中无法正常工作的问题,并找到了getActiveUniform,它返回了有关制服(包括名称)的一些信息。 签名是(根据规范):
WebGLActiveInfo? getActiveUniform(WebGLProgram? program, GLuint index);
我惊讶地发现它首先为所有制服返回了相同的名称,但后来我再次查看了签名,并意识到它需要一个整数作为第二个参数,如果我手动将其更改为0,1, 2等它给了制服。不幸的是,你从getUniformLocation获得的是一个不透明的对象。
这是规范中的疏忽,还是实际上有某种方法可以正确调用此功能? (因为我找不到任何东西)。
答案 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);
使用getActiveAttrib
和getAttribLocation
以相同的方式使用attrib可以做同样的事情。