WebGLRenderingContext: getActiveUniform() 方法
注意:此功能在 Web Workers 中可用。
WebGLRenderingContext.getActiveUniform() 方法是 WebGL API 的一部分,它返回一个 WebGLActiveInfo 对象,其中包含 uniform 属性的大小、类型和名称。它通常用于查询未知的 uniform,以进行调试或通用库创建。
语法
getActiveUniform(program, index)
参数
program-
一个
WebGLProgram,指定要从中获取 uniform 变量信息的 WebGL 着色器程序。 index-
一个
GLuint,指定要获取的 uniform 属性的索引。此值是 0 到 N - 1 的索引,由gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS)返回。
返回值
一个 WebGLActiveInfo 对象,描述该 uniform。
返回值中的 type 属性将是以下值之一:
gl.FLOATgl.FLOAT_VEC2gl.FLOAT_VEC3gl.FLOAT_VEC4gl.INTgl.INT_VEC2gl.INT_VEC3gl.INT_VEC4gl.BOOLgl.BOOL_VEC2gl.BOOL_VEC3gl.BOOL_VEC4gl.FLOAT_MAT2gl.FLOAT_MAT3gl.FLOAT_MAT4gl.SAMPLER_2Dgl.SAMPLER_CUBE- 当使用 WebGL 2 context 时,还可以使用以下值:
gl.UNSIGNED_INTgl.UNSIGNED_INT_VEC2gl.UNSIGNED_INT_VEC3gl.UNSIGNED_INT_VEC4gl.FLOAT_MAT2x3gl.FLOAT_MAT2x4gl.FLOAT_MAT3x2gl.FLOAT_MAT3x4gl.FLOAT_MAT4x2gl.FLOAT_MAT4x3gl.SAMPLER_3Dgl.SAMPLER_2D_SHADOWgl.SAMPLER_2D_ARRAYgl.SAMPLER_2D_ARRAY_SHADOWgl.SAMPLER_CUBE_SHADOWgl.INT_SAMPLER_2Dgl.INT_SAMPLER_3Dgl.INT_SAMPLER_CUBEgl.INT_SAMPLER_2D_ARRAYgl.UNSIGNED_INT_SAMPLER_2Dgl.UNSIGNED_INT_SAMPLER_3Dgl.UNSIGNED_INT_SAMPLER_CUBEgl.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.foo和c.bar。 -
结构体或数组的数组:数组的每个条目将生成其自己的条目。例如:
uniform struct { float foo; vec4 bar; } d[2];将生成:d[0].food[0].bard[1].food[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。
示例
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 |
浏览器兼容性
加载中…