Вычислить шейдер и рабочую группу

Я хочу понять, как работать с вычислительными шейдерами. Я не нашел никаких деталей в интернете. Что такое рабочая группа?

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,

Другие вопросы по тегам