计算着色器和工作组

时间:2019-02-18 15:00:24

标签: glsl vulkan

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

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

这是什么意思?

vkCmdDispatch(cmdBuffer, 1, 1, 1);

着色器和函数中的值应该相同吗?

1 个答案:

答案 0 :(得分:2)

为理解计算着色器的这些基本概念,OpenCL,OpenGL,Metal,D3D和CUDA计算的材料也将是相关的:它们都使用类似的分层网格细分方式。

按照Vulkan的术语,从最细到最粗的层次是:调用(aka线程)>子组>本地工作组>全局工作组(aka调度)。子组是一个更高级的主题。您现在可以忽略它们,因为它们大多是隐式的。只是让人感到困惑,人们通常在说“本地工作组”时只说“工作组”。

着色器中的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_LocalInvocationIDgl_GlobalInvocationID找出它在本地和全局网格中的位置,和gl_LocalInvocationIndex