subgroupAny
subgroupAny
对子组(subgroup/wave)内的布尔谓词进行 Any 投票:如果当前子组中任意活动 invocation 的谓词为真,则返回 true。该函数以“意图节点”形式附着在布尔表达式上(零参数),用法为 `boolExpr.subgroupAny()`。
核心优势
在 GPU 子组范围内进行高速一致性的布尔归约判断,无需共享内存或显式循环,可用于在同一 wave 内进行条件分支的早退出/汇合控制,降低分歧与开销(取决于后端对子组的支持)。
常见用途
早退出/屏蔽:如果组内任一像素/线程满足条件,则整组走某条分支(如启用昂贵效果)。
边缘/事件聚合:只要子组中有人检测到边缘/命中,就让整组一起高亮或写标记。
可见性/开销门控:仅当组内有需要时才计算复杂项(例如某通道或贴图采样)。
如何调整
无独立可调参数。将你要投票的布尔表达式作为“接收者”再调用 .subgroupAny() 即可。注意:需要图形后端支持 GPU 子组/波前(例如 WebGPU/WGSL 等);在不支持的平台上此类子组函数可能不可用或被降级。
代码示例
1/* 对“过亮”布尔表达式做子组 Any 投票 */
2const luma = dot( baseColor.rgb, vec3( 0.2126, 0.7152, 0.0722 ) );
3const isOverBright = luma.greaterThan( 1.0 );
4
5/* 意图节点:零参数,挂在布尔表达式上 */
6const anyOverBright = isOverBright.subgroupAny();
7
8/* 若子组里有任意一个过亮,则整组轻微发光 */
9material.emissiveNode = anyOverBright.cond( vec3( 1, 1, 0 ).mul( 0.2 ), vec3( 0 ) );