我想了解如何使用计算着色器。我在互联网上找不到任何详细信息。什么是工作组?
layout (local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
这是什么意思?
vkCmdDispatch(cmdBuffer, 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_NumWorkGroups
,gl_WorkGroupID
,gl_LocalInvocationID
,gl_GlobalInvocationID
找出它在本地和全局网格中的位置,和gl_LocalInvocationIndex
。