computer shader详解
使用方式
-
代码侧调度计算管线任务
vkCmdDIspatch(commandBuffer, groupSize.x, groupSize.y, groupSize.z)
groupSize
代表工作组数量(xyz三个方向上) -
shader侧配置设置
layout(local_size_x=6, local_size_y=4) in;
设置本地工作组大小,
local_size_z
未设置取默认值1
WorkGroup参数说明
以上图为例
-
全局工作组, groupSize.x =3 , groupSize.y=4, groupSize.z=8
-
gl_NumWorkGroups
:(3,4,8),全局工作组大小。 -
gl_WorkGroupSize
:(6,4,1),本地工作组大小。 -
gl_WorkGroupID
:(2,2,4),本地工作组在全局工作组中的位置。 -
gl_LocalInvocationID
:(5,3,0),计算单元在本地工作组的位置。 -
gl_GlobalInvocationID
:(17,11,4),计算单元在全局工作自的位置,gl_WorkGroupID * gl_WorkGroupSize + gl_LocalInvocationID -
gl_LocalInvocationIndex
:23,计算单元在本地工作组的索引,gl_LocalInvocationID.z * gl_WorkGroupSize.x * gl_WorkGroupSize.y + gl_LocalInvocationID.y * gl_WorkGroupSize.x +gl_LocalInvocationID.x;
Subgroup参数说明
如果一个本地工作组分成如上图所示的subgroup,则有如下参数
-
gl_NumSubgroups
:8,本地工作组内的子组数 -
gl_SubgroupID
:[0,7],本地工作组内子组的ID,范围[0,gl_NumSubgroups) -
gl_SubgroupSize
:32,子组的容量大小 -
gl_SubgroupInvocationID
:[0,31],子组内计算单元的ID,范围[0,gl_SubgroupSize)