WebGLRenderingContext: getActiveUniform() 方法

基线 广泛可用

此功能已得到很好的建立,并在许多设备和浏览器版本中运行。它在浏览器中可用,自 2015 年 7 月.

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

语法

js
getActiveUniform(program, index)

参数

program

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

index

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

返回值

一个 WebGLActiveInfo 对象,描述了统一。

返回值的 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 上下文 时,以下值也可能出现
    • 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 会创建一个活动统一列表。这些是 getActiveUniform 返回值的 name 属性的可能值。WebGL 会根据着色器中声明的统一类型在列表中生成一个或多个条目。

  • 单个基本类型:一个带有统一名称的条目。例如:uniform vec4 a; 将导致 a
  • 基本类型的数组:一个带有统一名称的条目,后缀为 [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 Block { float foo; }; 将导致 foo,而 uniform Block { float bar; } e; 将导致 e.bar

返回值的 size 属性对应于声明为数组的统一的数组长度。否则,它是 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

浏览器兼容性

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

另请参阅