На самом деле я реализовал технику, описанную в этой главе, используя объекты FrameBuffer в качестве метода рендеринга в текстуру (но в десктопном OpenGL, поскольку WebGL в то время не существовало), так что это определенно возможно. К сожалению, я не верю, что у меня больше есть код, но если вы отметите любые будущие вопросы с помощью [webgl], я посмотрю, смогу ли я чем-то помочь.
Вам нужно будет пинг-понгить несколько раз за кадр (в статье упоминается пять шагов, но я, кажется, помню, что точное количество зависит от качества желаемой симуляции и ваших точных граничных условий). Использование FBO немного более эффективно, чем это было, когда это было написано (автор упоминает об использовании GeForce FX 5950, что было некоторое время назад), поэтому я бы не беспокоился о накладных расходах, которые он упоминает в статье. Пока вы не возвращаете данные обратно в ЦП, переключение между текстурой и фреймбуфером не должно быть слишком дорогим.
У вас будет некоторая утечка, если ваши границы толщиной всего в пиксель, но это может быть или не быть приемлемым в зависимости от того, как вы визуализируете свои результаты и скорость вашей жидкости. Утолщение границ может помочь, и после этого были написаны статьи, в которых исследуются различные способы удержания жидкости в границах (я также припоминаю несколько статей о более эффективных решателях диффузии/давления, которые вы могли бы проверить после того, как освоите эту статью). версия работает... вы найдете интересные дополнения, если будете искать бумаги, в которых цитируется статья о драгоценных камнях графического процессора в Google Scholar).
Приложение: Я не уверен, что полностью понимаю ваш вопрос о границах. Суть в том, что вы должны запускать шейдер для каждого пикселя того, что вы хотите сделать границей, но на самом деле не имеет значения, как этот пиксель попадает туда, нарисован ли он линиями, точками или треугольниками (при условии, что его входные данные являются правильными).
В очень общем случае (который может быть неприменим, если у вас есть только ограниченное количество граничных примитивов), вам, вероятно, придется рисовать четырехугольник, покрывающий буфер кадра, поскольку взаимодействия с полями скорости и давления более сложны (любой окружающий пиксель может быть другим граничным пикселем вместо просто определенных краев). См. раздел 38.5.4 (Произвольные границы) для объяснения того, как это сделать. Если что-то не является границей, вы не будете касаться векторного поля, а если это так, вместо того, чтобы жестко указывать, в каких направлениях вы хотите смотреть, чтобы суммировать векторные значения, вы, вероятно, в конечном итоге проверите окружающие пиксели и только суммируете те, которые не являются границами, чтобы вы могли применять граничные условия.
person
Brendan Kenny
schedule
24.07.2012