countLeadingZeros
countLeadingZeros
返回 32 位整数从最高有效位(MSB)开始连续为 0 的比特数量。支持 uint/int 以及它们的向量版本,是一种专门用于分析整数 bit 模式的低层级工具函数。
核心优势
为 WebGPU 渲染管线暴露了 GPU 原生(或等价仿真)的 countLeadingZeros 能力,可以在着色器内部直接基于“整数的有效位宽”进行分支、索引或层级计算,比用浮点 log2/循环搜索更高效、更精确,也更贴近底层位运算模型。
常见用途
根据整数的最高有效 1 位推导其“数量级”或有效位宽(如 31 - clz(x)),用于构建基于幂次/层级的 LOD、Mip 级别或离散分段函数。
对哈希结果或随机整数做 bit 级别的“分桶”:不同的前导零数量映射到不同的颜色、粗糙度或强度区间,用于程序化材质或特效分层。
快速评估一个位掩码(bitmask)的“稀疏程度”或高位占用情况,例如:根据掩码处于高位/低位的情况调整特效强度或选择不同分支。
调试或可视化整数 bit 模式:把前导零数量归一化到 0–1,再将其作为亮度、蒙版或混合因子,帮助观察编码/哈希结果是否符合预期。
如何调整
countLeadingZeros 的结果是离散的整数(0–32),不会产生平滑过渡。调整思路主要集中在:1)输入类型必须是整数(uint/int 或对应向量),如果是浮点值,应先通过自定义规则转换为整数或 bitmask;2)注意输入为 0 时按约定返回 32,可利用这一特性将“完全为空”的状态映射到一个特殊分支;3)通常会将结果通过 float() 转为浮点再除以 32 进行归一化,用作 LOD、权重或分段索引;4)根据官方注释,此节点主要在 WebGPURenderer + WebGPU backend 下使用,若在其他后端使用请注意兼容性和性能。
代码示例
1// 假设有一个 32 位无符号整数 mask,用 bit 模式编码了一些状态
2const mask = uint( 0x0000FFFF );
3
4// 计算从最高有效位开始连续为 0 的 bit 数量(范围 0–32)
5// 对向量类型 (uvec2 / uvec3 / ...) 会对每个分量分别计算
6const leadingZeros = countLeadingZeros( mask );
7
8// 将前导 0 数量映射到 0–1 区间,用作强度或混合因子
9const intensity = float( leadingZeros ).div( 32.0 );
10
11// 使用结果驱动材质颜色(示意)
12material.colorNode = vec3( intensity );