WebGLUniformLocation 对象有哪些属性?

Ran*_*lue 1 javascript webgl

这是我的片段着色器,其中包含uniform

precision highp float;

uniform sampler2D uSampler;
varying vec2 vPosition;

void main() {
    gl_FragColor = texture2D(uSampler, vPosition);
}
Run Code Online (Sandbox Code Playgroud)

现在我调用该函数的地方getUniformLocation

var uniformLocation = gl.getUniformLocation(program, 'uSampler')
Run Code Online (Sandbox Code Playgroud)

我得到一个WebGLUniformLocation似乎没有附加任何属性的值:

for(a in uniformLocation) { console.log(a); } // prints no results
Run Code Online (Sandbox Code Playgroud)

为什么WebGLUniformLocation物体没有财产?

gma*_*man 5

AWebGLUniformLocation只是制服位置的不透明手柄,以便您可以设置制服。在真实的 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
Run Code Online (Sandbox Code Playgroud)

同样,他们可能会这样做

//--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
Run Code Online (Sandbox Code Playgroud)

或者他们可以这样做

//--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
Run Code Online (Sandbox Code Playgroud)

根据 OpenGL 规范,所有这些都是非法和错误的。有时这没关系。如果您正在编写一些 OpenGL 程序,并且只需要它在您的个人计算机或某些固定硬件上运行,那么您可能并不关心它是否有问题(如果它碰巧运行)。

但对于 WebGL 来说这还不够好。如果可能的话,您希望编写一次代码并让它在任何地方运行。为了防止此类错误,WebGL 返回 a,WebGLUniformLocation这样您就无法进行任何数学运算,也无法在另一个程序上使用一个程序的位置。