GPGPU - эффективный метод пинг-понга?

Я пытаюсь реализовать эффективный решатель жидкости на графическом процессоре, используя программирование шейдеров WebGL и GLSL.

Я нашел интересную статью: http://http.developer.nvidia.com/GPUGems/gpugems_ch38.html

См.: 38.3.2 Операции с плитами

Мне интересно, возможен ли этот метод обеспечения граничных условий с помощью рендеринга пинг-понга? Если я визуализирую только линии, как насчет внутренней части текстуры? Я всегда предполагал, что вся входная текстура должна быть скопирована во временную текстуру (граница ofc обновляется во время этого процесса), так как они меняются местами после этой операции.

Это интересно, особенно учитывая тот факт, что Пример 38-5. Программа фрагментов граничных условий (визуализация: http://i.stack.imgur.com/M4Hih.jpg) показывает схему, которая ИМХО требует техники пинг-понга.

Что вы думаете? Я что-то неправильно понимаю?

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


person piotrek    schedule 24.07.2012    source источник


Ответы (1)


На самом деле я реализовал технику, описанную в этой главе, используя объекты FrameBuffer в качестве метода рендеринга в текстуру (но в десктопном OpenGL, поскольку WebGL в то время не существовало), так что это определенно возможно. К сожалению, я не верю, что у меня больше есть код, но если вы отметите любые будущие вопросы с помощью [webgl], я посмотрю, смогу ли я чем-то помочь.

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

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

Приложение: Я не уверен, что полностью понимаю ваш вопрос о границах. Суть в том, что вы должны запускать шейдер для каждого пикселя того, что вы хотите сделать границей, но на самом деле не имеет значения, как этот пиксель попадает туда, нарисован ли он линиями, точками или треугольниками (при условии, что его входные данные являются правильными).

В очень общем случае (который может быть неприменим, если у вас есть только ограниченное количество граничных примитивов), вам, вероятно, придется рисовать четырехугольник, покрывающий буфер кадра, поскольку взаимодействия с полями скорости и давления более сложны (любой окружающий пиксель может быть другим граничным пикселем вместо просто определенных краев). См. раздел 38.5.4 (Произвольные границы) для объяснения того, как это сделать. Если что-то не является границей, вы не будете касаться векторного поля, а если это так, вместо того, чтобы жестко указывать, в каких направлениях вы хотите смотреть, чтобы суммировать векторные значения, вы, вероятно, в конечном итоге проверите окружающие пиксели и только суммируете те, которые не являются границами, чтобы вы могли применять граничные условия.

person Brendan Kenny    schedule 24.07.2012
comment
Меня больше всего беспокоит конкретное применение граничных условий, описанных в этой статье. Отрисовывается всего 4 строки вместо quad. Я думаю, что при рендеринге в пинг-понг это может быть невозможно, так как если я подменяю текстуру после рендера, она должна быть заполнена полностью, а не только по границам (так что рендерите с помощью quad, а не линий). Итак, можно ли отрендерить только 4 строки и использовать какой-то трюк или мне нужно использовать quad? - person piotrek; 25.07.2012
comment
посмотрите, поможет ли добавление, которое я сделал, ответить на ваши вопросы. - person Brendan Kenny; 27.07.2012