WebGLRenderingContext: getActiveUniform() 方法
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.foo
和c.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 的浏览器中加载。