subgroupOr
subgroupOr
在同一子组内,对所有激活调用的整型输入 e 执行按位或归约,并将相同结果返回给该子组的每个调用。
核心优势
用硬件子组指令在常数时间聚合每线程位标志,避免共享内存与显式循环,降低分支发散与同步开销。
常见用途
将每线程布尔条件转为 0/1 后做子组范围的“是否存在”为真判定(等价 any,但保留位掩码语义)。
合并每线程 bitmask,得到子组统一掩码,用于开关一段着色逻辑或生成单次写回信号。
与 invocationSubgroupIndex 搭配,仅让 lane 0 写出归约结果,避免重复写入。
如何调整
仅接收 1 个整型参数 e(int/uint)。若输入为布尔或浮点,先用 uint()/int() 转换。常见做法是先将条件映射为 0/1 或位域,再用 subgroupOr 聚合;用 notEqual(result, uint(0)) 将结果转布尔;必要时搭配 shiftLeft/bitOr 构造或解析掩码。归约结果在子组内一致,可用于减少子组内分支发散。
代码示例
1// 将每线程条件映射为 0/1,并用 subgroupOr 归约;结果统一控制整球换色
2<Canvas>
3 <mesh>
4 <sphereGeometry args={[0.4, 128, 128]} />
5 <meshStandardNodeMaterial
6 colorNode={
7 select(
8 vec3(0.25, 0.25, 0.3),
9 vec3(0.9, 0.4, 0.2),
10 notEqual(
11 subgroupOr(
12 uint(
13 greaterThan(
14 fract( positionLocal.x.mul(10.0) ),
15 0.5
16 )
17 )
18 ),
19 uint(0)
20 )
21 )
22 }
23 />
24 </mesh>
25</Canvas>