У меня уже была проблема, что я хотел смешать значения цвета в единице изображения, выполнив что-то вроде:
vec4 texelCol = imageLoad(myImage, myTexel);
imageStore(myImage, myTexel, texelCol+newCol);
В сценарии, где несколько фрагментов могут иметь одно и то же значение для 'myTexel', это не возможно, потому что нельзя создавать атомарность между командами imageLoad и imageStore, а другие shaderinvocations могут изменять цвет текселя между ними.
Теперь кто-то сказал мне, что poeple работают вокруг этой проблемы, создавая семафоры, используя атомарные комманды на текстурах uint, так что шейдер будет как-то ждать в цикле до доступа к текселю, и как только он станет свободным, атомарно напишите itno целочисленная текстура, чтобы блокировать другие вызовы фрагментарного шейдера, обрабатывать цветной тексель и, когда он закончил атомарно освобождать целочисленный тексель снова.
Но я не могу понять, как это могло бы работать и как выглядел бы такой код?
Действительно ли это возможно? может ли шейдер фрагмента GLSL быть установленным для ожидания в цикле while? Если это возможно, может ли кто-нибудь привести пример?