Общие переменные в шейдерах Fragment в Metal или OpenGLES
Это может быть маловероятным, но есть ли концепция общих глобальных переменных, которые могут обновляться при каждом проходе фрагментных шейдеров в Metal & OpenGLES? Я хочу обновить статистику после обработки каждого пикселя. Я предполагаю, что будет много проблем параллелизма, поскольку каждый фрагментный шейдер работает параллельно.
2 ответа
Что-то вроде atomic_uint? Мне нужно было сделать что-то подобное в последнее время, и это то, что я использовал. Смотрите ответ на мой вопрос здесь: Как реализовать / использовать атомный счетчик в шейдерном фрагменте Metal?
Атомная производительность от фрагментных шейдеров, по правде говоря, может быть отстойной, так как вы получите много параллельных операций чтения и записи с нескольких ядер шейдеров, поскольку шейдеры будут очень короткими, если вы выберете наивный фрагмент 1 для подхода входных текселей.
Обычная реализация для этого заключается в кодировании гистограммы как кадрового буфера.
Прочитайте текстуру в вершинном шейдере и поместите одну точку в положение, которое соответствует координате "гистограммы".
Гистограмму можно накапливать, используя операции смешивания.
Считайте обратно гистограмму в CPU, используя glReadPixels.