Общие переменные в шейдерах Fragment в Metal или OpenGLES

Это может быть маловероятным, но есть ли концепция общих глобальных переменных, которые могут обновляться при каждом проходе фрагментных шейдеров в Metal & OpenGLES? Я хочу обновить статистику после обработки каждого пикселя. Я предполагаю, что будет много проблем параллелизма, поскольку каждый фрагментный шейдер работает параллельно.

2 ответа

Что-то вроде atomic_uint? Мне нужно было сделать что-то подобное в последнее время, и это то, что я использовал. Смотрите ответ на мой вопрос здесь: Как реализовать / использовать атомный счетчик в шейдерном фрагменте Metal?

Атомная производительность от фрагментных шейдеров, по правде говоря, может быть отстойной, так как вы получите много параллельных операций чтения и записи с нескольких ядер шейдеров, поскольку шейдеры будут очень короткими, если вы выберете наивный фрагмент 1 для подхода входных текселей.

Обычная реализация для этого заключается в кодировании гистограммы как кадрового буфера.

Прочитайте текстуру в вершинном шейдере и поместите одну точку в положение, которое соответствует координате "гистограммы".

Гистограмму можно накапливать, используя операции смешивания.

Считайте обратно гистограмму в CPU, используя glReadPixels.

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