我想了解如何使用计算着色器。我在网上找不到任何细节。什么是workingGroup?
layout (local_size_x = 1, local_size_y = 1, local_size_z = 1) in;这是什么意思?
vkCmdDispatch(cmdBuffer, 1, 1, 1);着色器中的值和函数中的值是否应该相同?
发布于 2019-02-18 23:47:39
为了理解计算着色器的这些基本概念,OpenCL、OpenGL、金属、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 built-in input variables gl_NumWorkGroups、gl_WorkGroupID、gl_LocalInvocationID、gl_GlobalInvocationID和gl_LocalInvocationIndex找出它在本地和全局网格中的位置。
https://stackoverflow.com/questions/54750009
复制相似问题