subgroupBroadcast
subgroupBroadcast
从子组内 subgroup_invocation_id 等于 id 的调用处取值 e,并广播给该子组所有激活调用。签名:subgroupBroadcast(e, id)。
核心优势
在子组内零显式同步共享数据,避免重复计算与共享内存开销。
常见用途
每子组只计算一次并复用(如随机数、噪声或材质参数)
并行归约/扫描中的领导线程广播
瓦片/分块光照与屏幕后处理的跨线程通信
构建波/warp 级并行原语
如何调整
e 为要广播的数值;id 选定作为来源的子组调用索引。id 应在 [0, subgroupSize-1]。广播源必须是激活调用,否则结果未定义。仅作用于当前子组,不跨工作组。子组大小与调度可能变化,避免依赖固定 id 产生稳定视觉特征。仅当后端支持子组特性时有效,不支持时应提供回退(例如直接使用 e)。该节点由 nodeProxyIntent(SubgroupFunctionNode, SUBGROUP_BROADCAST) 构造,并限定参数个数为 2。
代码示例
1<Canvas>
2 <mesh>
3 <sphereGeometry args={[0.5, 128, 128]} />
4 <meshStandardNodeMaterial
5 // 将 id=0 线程的明暗值广播到整个子组
6 roughnessNode={ subgroupBroadcast( clamp( dot( normalView, vec3(0, 0, 1) ), 0.0, 1.0 ), 0 ) }
7 />
8 </mesh>
9</Canvas>