countOneBits
countOneBits
countOneBits 用于统计输入整数或整数向量的二进制表示中,被置为 1 的位的数量(也称 Popcount / Hamming weight)。对于向量输入,它会对每个分量分别统计,并返回相同维度的整数结果。
核心优势
将复杂的位统计逻辑封装为单个节点,在 WebGPU 后端上通常可映射到 GPU 原生的位计数指令,性能极高。非常适合在着色器中从紧凑的位掩码或哈希值中,快速提取“权重”“密度”等结构信息,而无需在 CPU 端解包。
常见用途
从整数标志位(flags)中统计当前启用的功能数量,并据此调节材质强度或混合比例
对基于屏幕坐标或网格 ID 的哈希结果使用 countOneBits,生成可重复的伪随机图案、闪烁或抖动效果
在 GPGPU 计算、体积渲染或分层效果中,用“1 的个数”作为权重或等级指标,对不同样本/通道进行分类或分组
如何调整
countOneBits 的核心调整方式是改变输入的整数或整数向量:每翻转一位(二进制 0/1),输出都会产生离散跳变,而不是平滑渐变。因此它更适合用来控制分段效果、图案结构或权重等级,而不是直接做连续插值。常见做法是:先通过位运算/哈希生成一个 uint 或 uvecN,再用 countOneBits 得到 0–32(对单个 32 位分量)的计数结果,将其除以常数进行归一化后映射到颜色、透明度或强度上。对于向量输入,需要注意每个分量是独立统计的,可一次性为多个通道或样本生成不同等级。根据源码注释,该节点要求在 WebGPURenderer 且使用 WebGPU 后端时使用,以确保底层位操作得到正确支持。
代码示例
1// 使用 countOneBits 统计标志位中被置为 1 的个数
2const flags = uint( 0x0000000F ); // 低 4 位为 1
3const enabledCount = countOneBits( flags ); // 返回 4
4
5// 将结果归一化后作为自发光强度
6const glowStrength = enabledCount.float().div( 8.0 );
7
8meshStandardNodeMaterial( {
9 emissiveNode: color( '#00ffff' ).mul( glowStrength )
10} );