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