countTrailingZeros
返回 32 位整数从最低有效位(LSB)开始连续为 0 的比特数量,即“最低位 1 所在的索引值”。支持 uint/int 以及对应的向量类型,适合做 bitmask 解析、标志位优先级判断等底层位运算逻辑。
核心优势
在着色器中直接暴露了 GPU 原生(或等价仿真)的 countTrailingZeros 能力,可以非常高效地找到某个 bitmask 中最低位的 1,而不用手写 while 循环或逐位判断;同时支持向量分量逐个计算,方便用一个整数向量在多个通道上并行编码多路状态。
常见用途
从 bitmask 中找到“最低优先级的激活标志”,例如:根据最低位 1 的索引选择当前启用的 LOD、灯光通道或纹理通道。
用于判断整数的 2 的幂次程度(对于纯 2 的幂,trailingZeros(x) 等于 log2(x)),可直接用于层级索引、mipmap 级别选择等。
对哈希结果或随机整数做 bit 级分桶:不同的 trailing zeros 数量对应不同的颜色梯度、粗糙度区间或特效层级。
在调试或可视化 bitmask 时,把 trailing zeros 数量归一化到 0–1,用作亮度或遮罩,检查哪些低位区域被占用。
如何调整
countTrailingZeros 的输出是离散整数(0–32),本身不会产生平滑过渡。常见用法是:1)确保输入为整数类型(uint/int 或对应向量),如果起点是浮点值,应先通过自定义规则映射为 bitmask;2)输入为 0 时在大多数实现中行为未定义,应在上游避免传入 0 或对 0 做单独分支;3)通常先用 float() 将结果转换为浮点并除以 32 得到 0–1 因子,再驱动 LOD、权重或分段索引;4)和 countLeadingZeros 搭配使用,可以从“最低位 1”和“最高位 1”这两侧共同分析一个整数的 bit 分布。根据官方注释,此节点主要用于 WebGPURenderer + WebGPU backend,其他后端使用时需要注意兼容性和性能。
代码示例
1// 一个 32 位无符号整数 bitmask,用 bit 位编码状态
2const mask = uint( 0x0010 );
3
4// 计算从最低有效位开始连续为 0 的 bit 数量
5// 对向量类型 (uvec2 / uvec3 / ...) 会对每个分量分别计算
6const tz = countTrailingZeros( mask );
7
8// 将结果转为浮点并归一化到 0–1 区间
9const factor = float( tz ).div( 32.0 );
10
11// 示例:根据 trailing zeros 数量在两种颜色之间插值
12const baseColor = vec3( 1.0, 0.3, 0.2 );
13const highColor = vec3( 0.2, 0.6, 1.0 );
14
15material.colorNode = mix( baseColor, highColor, factor );