Javascript 如何在WebGL中使用getActiveUniform
我试图调试我的制服在WebGL中无法正常工作的问题,并发现getActiveUniform,它返回有关制服的一些信息(包括名称)。 签名为(根据规范): 我惊讶地发现,它一开始为所有制服返回了相同的名称,但后来我再次查看了签名,发现它将整数作为第二个参数,如果我手动将其更改为0,1,2等,它将给出制服。不幸的是,从getUniformLocation得到的是一个不透明的对象Javascript 如何在WebGL中使用getActiveUniform,javascript,webgl,Javascript,Webgl,我试图调试我的制服在WebGL中无法正常工作的问题,并发现getActiveUniform,它返回有关制服的一些信息(包括名称)。 签名为(根据规范): 我惊讶地发现,它一开始为所有制服返回了相同的名称,但后来我再次查看了签名,发现它将整数作为第二个参数,如果我手动将其更改为0,1,2等,它将给出制服。不幸的是,从getUniformLocation得到的是一个不透明的对象 这是规范中的疏忽,还是实际上有某种方法可以正确调用此函数?(因为我找不到) 我不太清楚你在问什么,但我认为这是“getUn
这是规范中的疏忽,还是实际上有某种方法可以正确调用此函数?(因为我找不到) 我不太清楚你在问什么,但我认为这是“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 notundefined
或0
。不过,您可以通过包装所有属性函数来检查未定义的
。您还应该注意,getActiveUniform可以为实际不一致的内容返回信息。我不知道你说的疏忽是什么意思。WebGLUniformLocation故意不透明。这是一个不透明的位置id。
gl.uniformMatrix4fv(uniforms.uPMatrix, false, pMatrix);
gl.uniform1f(uniforms.uFogDistance, fogDistance);