WebGLRenderingContext: getActiveUniform() 方法

Baseline 已广泛支持

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

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

WebGLRenderingContext.getActiveUniform() 方法是 WebGL API 的一部分,它返回一个 WebGLActiveInfo 对象,其中包含 uniform 属性的大小、类型和名称。它通常用于查询未知的 uniform,以进行调试或通用库创建。

语法

js
getActiveUniform(program, index)

参数

program

一个 WebGLProgram,指定要从中获取 uniform 变量信息的 WebGL 着色器程序。

index

一个 GLuint,指定要获取的 uniform 属性的索引。此值是 0 到 N - 1 的索引,由 gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS) 返回。

返回值

一个 WebGLActiveInfo 对象,描述该 uniform。

返回值中的 type 属性将是以下值之一:

  • gl.FLOAT
  • gl.FLOAT_VEC2
  • gl.FLOAT_VEC3
  • gl.FLOAT_VEC4
  • gl.INT
  • gl.INT_VEC2
  • gl.INT_VEC3
  • gl.INT_VEC4
  • gl.BOOL
  • gl.BOOL_VEC2
  • gl.BOOL_VEC3
  • gl.BOOL_VEC4
  • gl.FLOAT_MAT2
  • gl.FLOAT_MAT3
  • gl.FLOAT_MAT4
  • gl.SAMPLER_2D
  • gl.SAMPLER_CUBE
  • 当使用 WebGL 2 context 时,还可以使用以下值:
    • gl.UNSIGNED_INT
    • gl.UNSIGNED_INT_VEC2
    • gl.UNSIGNED_INT_VEC3
    • gl.UNSIGNED_INT_VEC4
    • gl.FLOAT_MAT2x3
    • gl.FLOAT_MAT2x4
    • gl.FLOAT_MAT3x2
    • gl.FLOAT_MAT3x4
    • gl.FLOAT_MAT4x2
    • gl.FLOAT_MAT4x3
    • gl.SAMPLER_3D
    • gl.SAMPLER_2D_SHADOW
    • gl.SAMPLER_2D_ARRAY
    • gl.SAMPLER_2D_ARRAY_SHADOW
    • gl.SAMPLER_CUBE_SHADOW
    • gl.INT_SAMPLER_2D
    • gl.INT_SAMPLER_3D
    • gl.INT_SAMPLER_CUBE
    • gl.INT_SAMPLER_2D_ARRAY
    • gl.UNSIGNED_INT_SAMPLER_2D
    • gl.UNSIGNED_INT_SAMPLER_3D
    • gl.UNSIGNED_INT_SAMPLER_CUBE
    • gl.UNSIGNED_INT_SAMPLER_2D_ARRAY

调用 gl.linkProgram 时,WebGL 会创建一个活动的 uniform 列表。这些是 getActiveUniform 返回值的 name 属性的可能值。WebGL 根据 uniform 在着色器中声明的类型,在列表中生成一个或多个条目。

  • 基本类型的单一变量:一个条目,名称为 uniform 的名称。例如:uniform vec4 a; 将生成 a

  • 基本类型数组:一个条目,名称为 uniform 的名称,后跟 [0]。例如:uniform vec4 b[]; 将生成 b[0]

  • 结构体类型:结构体的每个成员一个条目。例如:uniform struct { float foo; vec4 bar; } c; 将生成 c.fooc.bar

  • 结构体或数组的数组:数组的每个条目将生成其自己的条目。例如:uniform struct { float foo; vec4 bar; } d[2]; 将生成:

    • d[0].foo
    • d[0].bar
    • d[1].foo
    • d[1].bar
  • Uniform 块:每个成员一个条目。如果 uniform 块具有实例名称,则会加上块名称前缀。例如:uniform Block { float foo; }; 将生成 foo,而 uniform Block { float bar; } e; 将生成 e.bar

返回值中的 size 属性对应于声明为数组的 uniform 的数组长度。否则,其值为 1(这包括实例化的接口块数组)。

异常

  • 如果程序 WebGLProgram 无效(未链接、已删除等),则生成 gl.INVALID_VALUE
  • 如果索引不在 [0, gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS) - 1] 范围内,则生成 gl.INVALID_VALUE

示例

js
const numUniforms = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS);
for (let i = 0; i < numUniforms; ++i) {
  const info = gl.getActiveUniform(program, i);
  console.log("name:", info.name, "type:", info.type, "size:", info.size);
}

规范

规范
WebGL 规范
# 5.14.10

浏览器兼容性

另见