numWorkgroups
numWorkgroups
在计算着色器中,提供由 CPU 端分派的全局任务规模,即整个计算网格在 x、y、z 三个维度上包含的工作组(Workgroup)总数。
核心优势
核心优势在于让着色器算法与具体的数据规模解耦。开发者无需在着色器中硬编码任务大小,只需在 CPU 端调用 compute() 时传入不同的工作组数量,即可让同一套算法灵活地处理不同尺寸的数据集。
常见用途
在图像处理中,用于确定总像素处理范围的边界。
在粒子系统模拟中,用于界定并行计算的总批次数,从而了解整个模拟任务的范围。
在并行数据算法(如排序、归约)中,用于定义整个问题空间的大小,确保每个线程都能感知数据结构的总规模。
如何调整
此节点在着色器中是只读的,无法直接调整。它的值由 CPU 端调用 `compute(x, y, z)` 函数时的参数决定。例如,将调用从 `compute(shader, 16, 16)` 改为 `compute(shader, 32, 16)`,着色器中 `numWorkgroups.x` 的值就会从 16 变为 32,从而将计算任务的范围在 X 轴上扩大一倍。
代码示例
1// 计算网格中所有线程的总数
2const totalInvocations = numWorkgroups.mul(workgroupSize);
3
4// 计算当前线程的归一化坐标 (类似UV)
5const uv = globalInvocationID.xy.div(totalInvocations.xy.sub(1));