Javascript 如何在WebGL中使用getActiveUniform

Javascript 如何在WebGL中使用getActiveUniform,javascript,webgl,Javascript,Webgl,我试图调试我的制服在WebGL中无法正常工作的问题,并发现getActiveUniform,它返回有关制服的一些信息(包括名称)。 签名为(根据规范): 我惊讶地发现,它一开始为所有制服返回了相同的名称,但后来我再次查看了签名,发现它将整数作为第二个参数,如果我手动将其更改为0,1,2等,它将给出制服。不幸的是,从getUniformLocation得到的是一个不透明的对象 这是规范中的疏忽,还是实际上有某种方法可以正确调用此函数?(因为我找不到) 我不太清楚你在问什么,但我认为这是“getUn

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

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


这是规范中的疏忽,还是实际上有某种方法可以正确调用此函数?(因为我找不到)

我不太清楚你在问什么,但我认为这是“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调用,也无需在除着色器本身之外的任何地方声明uniform变量:

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

同样的事情也可以通过使用
getActiveAttrib
getAttribLocation
以同样的方式使用Attrib来完成。

不建议将属性用于属性,因为如果调试GLSL,可能会关闭属性(通过注释或优化属性)。在这种情况下,像
gl.vertexattributepointer(attribs.texcoord,…)
这样的代码将以
attrib.texcoord
定义为未定义的
而结束,这将被强制为
0
,这可能会使程序陷入混乱。它适用于制服,因为
undefined
被强制为
null
,但attribs的no op为-1 not
undefined
0
。不过,您可以通过包装所有属性函数来检查
未定义的
。您还应该注意,getActiveUniform可以为实际不一致的内容返回信息。我不知道你说的疏忽是什么意思。WebGLUniformLocation故意不透明。这是一个不透明的位置id。
gl.uniformMatrix4fv(uniforms.uPMatrix, false, pMatrix);
gl.uniform1f(uniforms.uFogDistance, fogDistance);