Существуют вычисления, которые по своей природе 2 или 3 измерения. И есть вычисления, которые по своей природе являются одномерными. Кто-то будет испытывать неудобства. Либо многомерным пользователям придется взять 1D-индекс и превратить его в 2 / 3D-индексы, либо одномерным пользователям, возможно, придется взять 2 / 3D-индекс и сжать его до 1D.
Конечно, обратите внимание на разницу между "волей" и "май". Пользователи с одним измерением должны распознавать измерения Y или Z только в том случае, если ограничения реализации для измерения X команды dispatch слишком малы для выполнения достаточного количества вызовов. Учитывая, что во всех реализациях должно быть не менее 65535 рабочих групп для каждого измерения, что охватывает много вопросов.
Таким образом, хотя многомерный характер вычислительных операций может создавать неудобства для одномерной работы, существует множество одномерных работ, которые не вызывают неудобств. Так что «май» предпочтительнее «воли».
как из трех измерений получается фактическое число?
Предполагая, что вам нужно использовать кординаты Y и Z в вашей одномерной вычислительной операции вообще (и вы делаете это редко), существует множество способов сделать это. Они различаются только в зависимости от порядка различных размеров. Следующий способ использует порядок gl_LocalInvocationIndex
.
Если вам нужно получить индекс для конкретной рабочей группы, это достаточно просто:
uint WorkGroupIndex = dot(gl_WorkGroupID, uvec3(1, gl_NumWorkGroups.x, gl_NumWorkGroups.x * gl_NumWorkGroups.y));
Если вам нужно получить индекс для каждого вызова в течение всего вызова диспетчеризации, возьмите WorkGroupIndex
выше и сделайте следующее:
uint UniqueIndex = (WorkGroupIndex * gl_WorkGroupSize.x * gl_WorkGroupSize.y * gl_WorkGroupSize.z) + gl_LocalInvocationIndex;