我想了解如何使用计算着色器。我没有在互联网上找到任何详细信息。什么是工作组?
layout (local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
Run Code Online (Sandbox Code Playgroud)
什么意思?
vkCmdDispatch(cmdBuffer, 1, 1, 1);
Run Code Online (Sandbox Code Playgroud)
着色器中的值和函数中的值是否应该相同?
为了理解计算着色器的这些基本概念,OpenCL、OpenGL、Metal、D3D 和 CUDA 计算的材料也很重要:它们都使用类似的分层网格细分工作。
在 Vulkan 中,从最细到最粗的层次结构是:调用(又名线程)> 子组 > 本地工作组 > 全局工作组(又名调度)。子组是一个更高级的主题;您现在可以忽略它们,因为它们大多是隐式的。只是为了混淆,人们通常在指“本地工作组”时只说“工作组”。
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内置的输入变量 gl_NumWorkGroups,gl_WorkGroupID,gl_LocalInvocationID,gl_GlobalInvocationID,和gl_LocalInvocationIndex。