WebGLRenderingContext: getUniformLocation() 方法
注意:此功能在 Web Workers 中可用。
作为 WebGL API 的一部分,WebGLRenderingContext 的 getUniformLocation() 方法返回给定 WebGLProgram 中特定 **uniform** 变量的位置。
uniform 变量以 WebGLUniformLocation 对象的形式返回,它是一个不透明的标识符,用于指定 uniform 变量在 GPU 内存中的位置。
一旦获得 uniform 的位置,您就可以使用其他 uniform 访问方法之一来访问 uniform 本身,并将 uniform 位置作为输入之一传入。
getUniform()-
返回给定位置的 uniform 的值。
WebGLRenderingContext.uniform[1234][fi][v]()-
将 uniform 的值设置为指定值,该值可以是单个浮点数或整数,也可以是 2-4 分量的向量,可以作为值列表或
Float32Array或Int32Array指定。 WebGLRenderingContext.uniformMatrix[234][fv]()-
将 uniform 的值设置为指定的矩阵,可能带有转置。该值表示为
GLfloat值序列或Float32Array。
uniform 本身使用 GLSL 在着色器程序中声明。
语法
getUniformLocation(program, name)
参数
program-
要从中查找指定 uniform 变量的
WebGLProgram。 name-
一个字符串,指定要返回其位置的 uniform 变量的名称。名称中不能包含任何空格,并且不能使用此函数来获取任何以保留字符串
"gl_"开头的 uniform 的位置,因为那些是 WebGL 层内部使用的。可能的值对应于
getActiveUniform返回的 uniform 名称;有关声明的 uniform 如何映射到 uniform 位置名称的详细信息,请参阅该函数。此外,对于声明为数组的 uniform,以下名称也有效:
- 不带
[0]后缀的 uniform 名称。例如,为arrayUniform返回的位置等同于为arrayUniform[0]返回的位置。 - 带整数索引的 uniform 名称。例如,为
arrayUniform[2]返回的位置将直接指向arrayUniformuniform 的第三个条目。
- 不带
返回值
一个 WebGLUniformLocation 值,指示命名变量的位置(如果存在)。如果指定的变量不存在,则返回 null。
WebGLUniformLocation 是一个不透明的值,用于唯一标识 uniform 变量在 GPU 内存中的位置。有了这个值,您就可以调用其他 WebGL 方法来访问 uniform 变量的值。
注意: WebGLUniformLocation 类型在指定 uniform 属性的索引或位置时与 GLint 类型兼容。
错误
可能发生以下错误;要检查 getUniformLocation() 返回后的错误,请调用 getError()。
GL_INVALID_VALUE-
program参数不是 WebGL 生成的值或对象。 GL_INVALID_OPERATION-
program参数不对应 WebGL 生成的 GLSL 程序,或者指定的程序尚未成功链接。
示例
在此示例中,取自文章 A basic 2D WebGL animation example 的 animateScene() 方法,它从着色程序获取三个 uniform 的位置,然后设置每个 uniform 的值。
gl.useProgram(shaderProgram);
uScalingFactor = gl.getUniformLocation(shaderProgram, "uScalingFactor");
uGlobalColor = gl.getUniformLocation(shaderProgram, "uGlobalColor");
uRotationVector = gl.getUniformLocation(shaderProgram, "uRotationVector");
gl.uniform2fv(uScalingFactor, currentScale);
gl.uniform2fv(uRotationVector, currentRotation);
gl.uniform4fv(uGlobalColor, [0.1, 0.7, 0.2, 1.0]);
注意: 此代码片段取自“A basic 2D WebGL animation example”中的 animateScene() 函数。请参阅该文章以获取完整的示例,并查看实际的动画效果。
将当前着色程序设置为 shaderProgram 后,此代码会获取三个 uniform "uScalingFactor"、"uGlobalColor" 和 "uRotationVector",每次调用 getUniformLocation() 获取一个 uniform。
然后设置这三个 uniform 的值
uScalingFactoruniform — 一个 2 分量的顶点 — 从变量currentScale接收水平和垂直缩放因子。- uniform
uRotationVector被设置为变量currentRotation的内容。这同样是一个 2 分量的顶点。 - 最后,uniform
uGlobalColor被设置为颜色[0.1, 0.7, 0.2, 1.0],此 4 分量向量中的分量分别代表红色、绿色、蓝色和 alpha 的值。
完成此操作后,下一次调用着色函数时,它们各自名为 uScalingFactor、uGlobalColor 和 uRotationVector 的变量都将具有 JavaScript 代码提供的值。
规范
| 规范 |
|---|
| WebGL 规范 # 5.14.10 |
浏览器兼容性
加载中…