webgl2 方法解析: getActiveUniforms()

33 阅读2分钟

getActiveUniforms() 是 WebGL2 中用于查询着色器程序中统一变量(Uniform)信息的方法。它允许开发者批量获取多个统一变量的特定参数。

方法签名

any gl.getActiveUniforms(program, uniformIndices, pname);

参数说明

  1. program - 包含要查询的统一变量的WebGL程序对象

  2. uniformIndices - 一个包含要查询的统一变量索引的数组

  3. 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);

典型应用场景

  1. UBO布局分析:当使用统一变量块(Uniform Block)时,可以查询各uniform在块内的偏移量和布局信息
  2. 性能优化:了解uniform的存储特性有助于优化数据上传策略
  3. 调试工具:开发WebGL调试工具时,需要获取uniform的详细信息

注意事项

  1. 使用此方法前必须确保程序已成功链接
  2. 统一变量索引可以通过gl.getUniformIndices()方法获取
  3. 对于不属于任何统一变量块的uniform,UNIFORM_BLOCK_INDEX将返回-1
  4. 某些查询(如偏移量、步长)仅对统一变量块中的uniform有意义