WebGLRenderingContext:getUniformLocation() 方法

基线 广泛可用

此功能已得到良好确立,并且可在许多设备和浏览器版本中使用。它自以下时间起在浏览器中可用: 2015 年 7 月.

作为 WebGL API 的一部分,WebGLRenderingContext 方法 getUniformLocation() 返回给定 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 变量的值。

注意:当指定 uniform 属性的索引或位置时,WebGLUniformLocation 类型与 GLint 类型兼容。

错误

可能会发生以下错误;要检查 getUniformLocation() 返回后的错误,请调用 getError()

GL_INVALID_VALUE

program 参数不是 WebGL 生成的值或对象。

GL_INVALID_OPERATION

program 参数与 WebGL 生成的 GLSL 程序不对应,或者指定的程序尚未成功链接。

示例

在此示例中,摘自文章 基本的二维 WebGL 动画示例 中的 animateScene() 方法,获取着色器程序中三个 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]);

注意:此代码片段摘自“基本的二维 WebGL 动画示例”中的 函数 animateScene()。请参阅该文章以获取完整示例并查看结果动画。

将当前着色器程序设置为 shaderProgram 后,此代码获取三个 uniform "uScalingFactor""uGlobalColor""uRotationVector",每个 uniform 调用一次 getUniformLocation()

然后设置三个 uniform 的值。

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

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

规范

规范
WebGL 规范
# 5.14.10

浏览器兼容性

BCD 表格仅在启用 JavaScript 的浏览器中加载。

另请参阅