WebGLRenderingContext: getUniformLocation() 方法

Baseline 已广泛支持

此特性已相当成熟,可在许多设备和浏览器版本上使用。自 ⁨2015 年 7 月⁩以来,各浏览器均已提供此特性。

注意:此功能在 Web Workers 中可用。

作为 WebGL API 的一部分,WebGLRenderingContextgetUniformLocation() 方法返回给定 WebGLProgram 中特定 **uniform** 变量的位置。

uniform 变量以 WebGLUniformLocation 对象的形式返回,它是一个不透明的标识符,用于指定 uniform 变量在 GPU 内存中的位置。

一旦获得 uniform 的位置,您就可以使用其他 uniform 访问方法之一来访问 uniform 本身,并将 uniform 位置作为输入之一传入。

getUniform()

返回给定位置的 uniform 的值。

WebGLRenderingContext.uniform[1234][fi][v]()

将 uniform 的值设置为指定值,该值可以是单个浮点数或整数,也可以是 2-4 分量的向量,可以作为值列表或 Float32ArrayInt32Array 指定。

WebGLRenderingContext.uniformMatrix[234][fv]()

将 uniform 的值设置为指定的矩阵,可能带有转置。该值表示为 GLfloat 值序列或 Float32Array

uniform 本身使用 GLSL 在着色器程序中声明。

语法

js
getUniformLocation(program, name)

参数

program

要从中查找指定 uniform 变量的 WebGLProgram

name

一个字符串,指定要返回其位置的 uniform 变量的名称。名称中不能包含任何空格,并且不能使用此函数来获取任何以保留字符串 "gl_" 开头的 uniform 的位置,因为那些是 WebGL 层内部使用的。

可能的值对应于 getActiveUniform 返回的 uniform 名称;有关声明的 uniform 如何映射到 uniform 位置名称的详细信息,请参阅该函数。

此外,对于声明为数组的 uniform,以下名称也有效:

  • 不带 [0] 后缀的 uniform 名称。例如,为 arrayUniform 返回的位置等同于为 arrayUniform[0] 返回的位置。
  • 带整数索引的 uniform 名称。例如,为 arrayUniform[2] 返回的位置将直接指向 arrayUniform uniform 的第三个条目。

返回值

一个 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 exampleanimateScene() 方法,它从着色程序获取三个 uniform 的位置,然后设置每个 uniform 的值。

js
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 的值

  • uScalingFactor uniform — 一个 2 分量的顶点 — 从变量 currentScale 接收水平和垂直缩放因子。
  • uniform uRotationVector 被设置为变量 currentRotation 的内容。这同样是一个 2 分量的顶点。
  • 最后,uniform uGlobalColor 被设置为颜色 [0.1, 0.7, 0.2, 1.0],此 4 分量向量中的分量分别代表红色、绿色、蓝色和 alpha 的值。

完成此操作后,下一次调用着色函数时,它们各自名为 uScalingFactoruGlobalColoruRotationVector 的变量都将具有 JavaScript 代码提供的值。

规范

规范
WebGL 规范
# 5.14.10

浏览器兼容性

另见