计算着色器和工作组

Compute shader and workGroup

我想了解如何使用计算着色器。我没有在互联网上找到任何详细信息。什么是工作组?

layout (local_size_x = 1, local_size_y = 1, local_size_z = 1) in;

这是什么意思?

vkCmdDispatch(cmdBuffer, 1, 1, 1);

Shader中的值和函数中的值是否应该相同?

为了理解这些计算着色器的基本概念,material OpenCL、OpenGL、Metal、D3D 和 CUDA 计算也很重要:它们都使用类似的层次网格细分工作。

层次结构,从最好到最粗糙,在 Vulkan 术语中是:调用(又名线程)> 子组 > 本地工作组 > 全局工作组(又名分派)。子群是一个更高级的话题;你现在可以忽略它们,因为它们大多是隐含的。只是为了混淆,人们通常只说 "workgroup" 而他们的意思是 "local workgroup".

着色器中的 layout(local_size) 声明根据单个调用定义本地工作组的维度。 vkCmdDispatch 的参数根据本地工作组给出了全局工作组的维度。

因此,如果您调用 vkCmdDispatch(cmdbuf, M, N, P) 并且当前管线中的计算着色器声明为 layout (local_size_x=X, local_size_y=Y, local_size_z=Z),那么 Vulkan 将 运行 MxNxP 本地工作组,每个工作组都包含您的 XxYxZ 次调用着色器。

在每次调用中,您可以使用 GLSL built-in input variables gl_NumWorkGroupsgl_WorkGroupIDgl_LocalInvocationID、[=17= 找出它在本地和全局网格中的位置], 和 gl_LocalInvocationIndex.