Вычислить шейдер и рабочую группу
Я хочу понять, как работать с вычислительными шейдерами. Я не нашел никаких деталей в интернете. Что такое рабочая группа?
layout (local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
что это значит?
vkCmdDispatch(cmdBuffer, 1, 1, 1);
Должны ли значения в шейдере и в функции совпадать?
1 ответ
Для понимания этих базовых концепций вычислительных шейдеров также подойдет материал для вычислений OpenCL, OpenGL, Metal, D3D и CUDA: все они используют схожее иерархическое сеточное подразделение работы.
В терминах Вулкана иерархия, от самой тонкой до самой грубой, выглядит следующим образом: вызов (также известный как поток) > подгруппа> локальная рабочая группа> глобальная рабочая группа (также известная как диспетчеризация). Подгруппы - более сложная тема; Вы можете игнорировать их сейчас, поскольку они в основном неявные. Просто чтобы сбить с толку, люди часто просто говорят "рабочая группа", когда они имеют в виду "местная рабочая группа".
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
,