跳到主要内容

computer shader详解

· 阅读需 2 分钟
苏明才
Vulkan驱动填坑狮

使用方式

  • 代码侧调度计算管线任务

    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参数说明

1638971538231

以上图为例

  • 全局工作组, 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参数说明

1638972921886

如果一个本地工作组分成如上图所示的subgroup,则有如下参数

  • gl_NumSubgroups :8,本地工作组内的子组数

  • gl_SubgroupID :[0,7],本地工作组内子组的ID,范围[0,gl_NumSubgroups)

  • gl_SubgroupSize :32,子组的容量大小

  • gl_SubgroupInvocationID :[0,31],子组内计算单元的ID,范围[0,gl_SubgroupSize)