WebGLRenderingContext:getUniformLocation() 方法
作为 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]
返回的位置将直接指向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 的值。
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 的值。
完成此操作后,下次调用着色函数时,它们自己的名为 uScalingFactor
、uGlobalColor
和 uRotationVector
的变量都将具有 JavaScript 代码提供的值。
规范
规范 |
---|
WebGL 规范 # 5.14.10 |
浏览器兼容性
BCD 表格仅在启用 JavaScript 的浏览器中加载。