getActiveUniforms() 是 WebGL2 中用于查询着色器程序中统一变量(Uniform)信息的方法。它允许开发者批量获取多个统一变量的特定参数。
方法签名
any gl.getActiveUniforms(program, uniformIndices, pname);
参数说明
-
program - 包含要查询的统一变量的WebGL程序对象
-
uniformIndices - 一个包含要查询的统一变量索引的数组
-
pname - 指定要查询的参数类型,可以是以下值之一:
gl.UNIFORM_TYPE- 返回统一变量的数据类型gl.UNIFORM_SIZE- 返回统一变量的大小(对于数组,返回数组元素个数)gl.UNIFORM_NAME_LENGTH- 返回统一变量名称的长度(包括null终止符)gl.UNIFORM_BLOCK_INDEX- 返回统一变量所属的块索引(-1表示不属于任何块)gl.UNIFORM_OFFSET- 返回统一变量在块中的偏移量(以字节为单位)gl.UNIFORM_ARRAY_STRIDE- 返回统一变量数组元素的步长(以字节为单位)gl.UNIFORM_MATRIX_STRIDE- 返回统一变量矩阵列的步长(以字节为单位)gl.UNIFORM_IS_ROW_MAJOR- 返回布尔值,指示矩阵是否以行主序存储
返回值
返回一个数组,包含每个查询的统一变量的请求信息。数组元素的类型取决于查询的pname参数。
使用示例
// 获取程序中几个统一变量的信息
const program = ...; // 已链接的WebGL程序
const uniformIndices = [0, 1, 2]; // 要查询的统一变量索引
// 查询这些统一变量的类型
const uniformTypes = gl.getActiveUniforms(
program,
uniformIndices,
gl.UNIFORM_TYPE
);
// 查询这些统一变量在块中的偏移量
const uniformOffsets = gl.getActiveUniforms(
program,
uniformIndices,
gl.UNIFORM_OFFSET
);
console.log('Uniform types:', uniformTypes);
console.log('Uniform offsets:', uniformOffsets);
典型应用场景
- UBO布局分析:当使用统一变量块(Uniform Block)时,可以查询各uniform在块内的偏移量和布局信息
- 性能优化:了解uniform的存储特性有助于优化数据上传策略
- 调试工具:开发WebGL调试工具时,需要获取uniform的详细信息
注意事项
- 使用此方法前必须确保程序已成功链接
- 统一变量索引可以通过
gl.getUniformIndices()方法获取 - 对于不属于任何统一变量块的uniform,
UNIFORM_BLOCK_INDEX将返回-1 - 某些查询(如偏移量、步长)仅对统一变量块中的uniform有意义