subgroupBallot
subgroupBallot
对子组内的布尔条件进行投票,返回一个 vec4<u32> 的 128 位位掩码;当某个 invocation 的 pred 为 true 时,对应位为 1。
核心优势
在着色器内以 O(1) 成本拿到整个子组的并行投票结果,适合实现 warp/subgroup 级算法与分支决策。
常见用途
子组范围的 any/all 判定与早退控制
统计满足条件的线程数量
基于掩码的材质参数切换或分支着色
配合 subgroupInvocationID 做 lane 过滤或定位
如何调整
通过调整 pred 构造条件:可基于法线、深度、光照或随机数等。any 判定:any(notEqual(mask, uvec4(0)))。all 判定:all(equal(mask, uvec4(0xffffffffu)))。需要统计数量时对每个分量做位计数后求和(后端提供时可用 countOneBits/bitCount)。注意:依赖底层子组特性支持,WebGL 后端通常不可用。
代码示例
1<Canvas>
2 <mesh>
3 <sphereGeometry args={[0.4, 128, 128]} />
4 <meshStandardNodeMaterial
5 colorNode={
6 cond(
7 any( notEqual( subgroupBallot( gt( dot( normalView, vec3(0, 1, 0) ), 0.5 ) ), uvec4(0) ) ),
8 vec3(1.0, 0.25, 0.25),
9 vec3(0.2, 0.2, 1.0)
10 )
11 }
12 />
13 </mesh>
14</Canvas>