как считывать переменные из шейдера opegles?

Я пишу приложение фильтра частиц для Android. Я хочу, чтобы все частицы обрабатывались GPU параллельно.

У меня есть код в вершинном шейдере для обновления позиции каждой частицы или вершины на основе ее текущей позиции, но я не могу понять, как записать обновленное местоположение обратно в openGLES или даже сделать его доступным для обработки шейдера. ту же вершину при следующем прогоне.

Переменные атрибутов имеют соответствующую область действия, но считываются только внутри вершинного шейдера.

У юниформ-переменных есть соответствующая область видимости, но вы не можете делать массивы (поэтому было бы сложно реализовать юниформы для большого количества вершин). И снова они читаются только внутри вершинного шейдера.

Варьируемые переменные имеют область действия, позволяющую модифицировать их, но они видны только фрагментному шейдеру в программе. Что могло бы сработать, если бы фрагментный шейдер мог записывать информацию в openGLES. Могут ли фрагментные шейдеры изменять атрибутивные переменные (для следующего запуска)?

Есть ли способ для шейдеров фрагментов обновить любую переменную? {attribute,uniform,variable,default,other} а может буфер выписывать не на дисплей а в память?


person izzy    schedule 21.08.2013    source источник


Ответы (1)


Вы совершенно неправильно думаете о шейдерах. Они принимают входные данные (например, атрибуты, униформы, сэмплированные текстуры), выполняют некоторые вычисления, а затем выводят их для следующего этапа конвейера рендеринга.

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

Тем не менее, что вы можете сделать, так это написать вложенную текстуру, если вы используете FBO. Если вы сделаете это с умом, вы сможете найти значения этой текстуры в вершинном шейдере, чтобы определить новую позицию для вашей частицы. Вам придется придумать схему адресации, какой тексель соответствует какой частице, как упаковать свойства в 3-х или 4-х канальный тексель и т. д. Но именно так системы частиц на основе GPU часто реализовывались до вычислительных шейдеров.

В качестве альтернативы вы можете использовать трансформирующую обратную связь. Но я не уверен, поддерживает ли это OpenGL ES?

Я должен отметить, что при таком подходе все вычисления положения частиц, цвета и т. д. откладываются на специальный проход фрагментного шейдера. Ваш вершинный шейдер частиц в основном сводится к поиску текстуры с использованием результатов более раннего прохода фрагментного шейдера (чтобы установить положение, цвет и т. д., которые должна использовать вершина). Есть учебные пособия и технические демонстрации, связанные с этим, если вы посмотрите в Google. В любом случае, это действительно единственный способ сделать это на 100% на графическом процессоре на встроенном оборудовании, поскольку у вас нет вычислительных шейдеров или обратной связи преобразования.

person Andon M. Coleman    schedule 21.08.2013
comment
OpenGL ES 3.0 поддерживает обратную связь при преобразовании, но, к сожалению, я все еще вернулся к версии 2.0. Ваше предложение звучит так, как будто оно может сработать, но ссылка на пример поможет. Я посмотрю, что я могу найти теперь, когда я знаю, что искать. - person izzy; 22.08.2013