Javascript WebGLUniformLocation对象的属性是什么?

Javascript WebGLUniformLocation对象的属性是什么?,javascript,webgl,Javascript,Webgl,这是我的片段着色器,它包含一个统一的: precision highp float; uniform sampler2D uSampler; varying vec2 vPosition; void main() { gl_FragColor = texture2D(uSampler, vPosition); } 现在调用函数getUniformLocation: var uniformLocation = gl.getUniformLocation(program, 'uSamp

这是我的片段着色器,它包含一个
统一的

precision highp float;

uniform sampler2D uSampler;
varying vec2 vPosition;

void main() {
    gl_FragColor = texture2D(uSampler, vPosition);
}
现在调用函数
getUniformLocation

var uniformLocation = gl.getUniformLocation(program, 'uSampler')
我得到了一个
WebGLUniformLocation
,似乎没有附加属性:

for(a in uniformLocation) { console.log(a); } // prints no results

为什么
webgluniformlLocation
对象属性是空的?

A
webgluniformlLocation
只是制服位置的不透明句柄,以便您可以设置制服。在真正的OpenGL中,统一的位置是整数。不幸的是,许多程序员会对这些整数进行数学运算。例如,他们可能会这样做

//--shader--
uniform float a;
uniform float b;
...

// C
GLint location_a = glGetUniformLocation(program, "a");
GLint location_b = a + 1;   // ILLEGAL BUT MIGHT WORK ON SOME CARDS
类似地,他们可能会这样做

//--shader--
uniform float a[2];
...

// C
GLint location_a0 = glGetUniformLocation(program, "a[0]");
GLint location_a1 = a + 1;   // ILLEGAL BUT MIGHT WORK ON SOME CARDS
或者他们可以这样做

//--shader #1--
uniform float a;
...

//--shader #2--
uniform float a;
...


// C
GLint program_1 = CompileShadersAndLinkProgram(shader_1_src, ..);
GLint program_2 = CompileShadersAndLinkProgram(shader_2_src, ..);

// Get the location from program 1
GLint location_a = glGetUniformLocation(program_1, "a");

// Use a location from program 1 with program 2
glUseProgram(program_2);
glUnform1f(location_a, 123);  // ILLEGAL BUT MIGHT WORK ON SOME CARDS
根据OpenGL规范,所有这些都是非法的和错误的。有时也可以。如果您正在编写一些OpenGL程序,并且您只需要它在您的个人计算机或某些固定硬件上工作,那么如果它碰巧工作,您可能不在乎它是否错误


对于WebGL来说,这还不够好。在可能的情况下,您希望只编写一次代码,然后让它在任何地方运行。为了防止这些类型的错误,WebGL返回一个
WebGLUniformLocation
,这样你就不能做任何数学运算,也不能在另一个程序上使用一个程序的位置。

a
WebGLUniformLocation
只是一个指向制服位置的不透明句柄,你可以设置制服。在真正的OpenGL中,统一的位置是整数。不幸的是,许多程序员会对这些整数进行数学运算。例如,他们可能会这样做

//--shader--
uniform float a;
uniform float b;
...

// C
GLint location_a = glGetUniformLocation(program, "a");
GLint location_b = a + 1;   // ILLEGAL BUT MIGHT WORK ON SOME CARDS
类似地,他们可能会这样做

//--shader--
uniform float a[2];
...

// C
GLint location_a0 = glGetUniformLocation(program, "a[0]");
GLint location_a1 = a + 1;   // ILLEGAL BUT MIGHT WORK ON SOME CARDS
或者他们可以这样做

//--shader #1--
uniform float a;
...

//--shader #2--
uniform float a;
...


// C
GLint program_1 = CompileShadersAndLinkProgram(shader_1_src, ..);
GLint program_2 = CompileShadersAndLinkProgram(shader_2_src, ..);

// Get the location from program 1
GLint location_a = glGetUniformLocation(program_1, "a");

// Use a location from program 1 with program 2
glUseProgram(program_2);
glUnform1f(location_a, 123);  // ILLEGAL BUT MIGHT WORK ON SOME CARDS
根据OpenGL规范,所有这些都是非法的和错误的。有时也可以。如果您正在编写一些OpenGL程序,并且您只需要它在您的个人计算机或某些固定硬件上工作,那么如果它碰巧工作,您可能不在乎它是否错误


对于WebGL来说,这还不够好。在可能的情况下,您希望只编写一次代码,然后让它在任何地方运行。为了防止这些类型的错误,WebGL返回一个
WebGLUniformLocation
,这样您就不能进行任何计算,也不能在另一个程序上使用一个程序的位置。

非常有用。我以为我的位置值得到了错误的结果,直到我读到这篇非常有用的文章。在我读到这篇文章之前,我以为我的位置值得到了错误的结果