Московский Государственный Университет им. М.В. Ломоносова Факультет Вычислительной Математики и Кибернетики Кафедра Автоматизации Систем Вычислительных Комплексов Методы интерактивной визуализации динамики жидких и газообразных сред Дипломная работа студентки 521 группы Костиковой Елены Юрьевны Научный руководитель к.ф.-м.н. Игнатенко Алексей Викторович Москва, 2009 1 Содержание 1. Аннотация ...................................................................................................................... 4 2. Введение ........................................................................................................................ 5 3. Постановка задачи ........................................................................................................ 7 4. Обзор существующих решений рассматриваемой задачи и ее модификаций ....... 8 4.1 Шум Перлина ........................................................................................................ 8 4.1.1. История появления ....................................................................................... 8 4.1.2. Алгоритм...................................................................................................... 10 4.1.3. Применение ................................................................................................. 11 4.2 Использование уравнений в частных производных для моделирования движения газообразных и жидких сред ................................................................................ 12 4.2.1. Уравнения Навье-Стокса............................................................................ 12 4.2.2. Метод Лагранжа .......................................................................................... 14 4.2.3. Метод Эйлера .............................................................................................. 14 4.3 Применение уравнений Навье-Стокса для задач нефотореалистичной визуализации............................................................................................................................ 15 4.3.1. Алгоритм...................................................................................................... 15 4.3.2. Моделирование поверхности бумаги........................................................ 15 4.3.3. Математическая модель ............................................................................. 16 4.3.4. Выводы......................................................................................................... 18 4.4 Моделирование системой частиц ...................................................................... 19 4.4.1. Общая схема работы системы частиц ....................................................... 20 4.4.2. Генерация частиц ........................................................................................ 20 4.4.3. Атрибуты частиц ......................................................................................... 21 4.4.4. Динамика частиц ......................................................................................... 22 4.4.5. Умирание частиц......................................................................................... 22 4.4.6. Отображение частиц ................................................................................... 22 4.5 Визуализация объемных данных ....................................................................... 23 4.5.1. Метод бегущих кубов ................................................................................. 25 2 4.5.2. Использование текстур ............................................................................... 27 4.5.3. Трассировка лучей ...................................................................................... 30 4.6 Выводы................................................................................................................. 31 5. Исследование и построение решения задачи ........................................................... 32 5.1 Интерактивное моделирование дыма. .............................................................. 32 5.1.1. Математическая модель ............................................................................. 32 5.1.2. Движение плотностей ................................................................................. 33 5.1.3. Наличие источников плотности ................................................................ 34 5.1.4. Диффузия ..................................................................................................... 34 5.1.5. Движение плотности по полю скоростей ................................................. 35 5.1.6. Решение уравнения для скоростей ............................................................ 36 5.1.7. Граничные условия ..................................................................................... 36 5.1.8. Визуализация ............................................................................................... 43 6. Тестирование и сравнение ......................................................................................... 45 7. Описание практической части ................................................................................... 46 7.1 Схема работы программного решения ............................................................. 46 7.2 Реализация алгоритмов с использованием CUDA........................................... 47 7.2.1. Обзор технологии CUDA ........................................................................... 47 7.2.2. CUDA в моделировании ............................................................................. 48 7.2.3. CUDA для вокселизации ............................................................................ 50 7.2.4. CUDA для визуализации .............................Error! Bookmark not defined. 8. Заключение .................................................................................................................. 51 9. Литература ................................................................................................................... 52 3 1. Аннотация Методы интерактивной визуализации динамики жидких и газообразных сред Елена Костикова В данной дипломной работе было произведено исследование алгоритмов моделирования и визуализации жидких и газообразных сред. Эти задачи очень актуальны для целого ряда интерактивных приложений, таких как игровые приложения, кино и научная визуализация. Работа была выполнена в виде библиотеки с открытым кодом, на базе которой подготовлен ряд демонстрационных примеров. В ходе работы были предложены оригинальные решения и новые алгоритмы. Interactive simulation and rendering of fluids Elena Kostikova In this graduation thesis a research of algorithms for modeling and visualizing fluid and gaseous media was conducted. These problems are of current importance for a whole range of interactive applications, such as gaming applications, cinema and scientific visualization. The work was implemented as an open-source library, with a set of demo applications based on it. In the course of this work original solutions and new algorithms were proposed. 4 2. Введение В настоящее время одна из наиболее интригующих проблем в компьютерной графике – это моделирование жидких и газообразных сред. Во многих областях потребность в инструменте подобного рода очень высока. В киноиндустрии необходимо убедительно мимикрировать (подражать) внешнему виду и поведению таких сред как: дым, вода и огонь. Программное обеспечение, используемое художниками и дизайнерами, также может выиграть от использования физического моделирования для имитации традиционных техник, как рисование акварелью или маслеными красками. Еще одно потенциальное приложение – это синтез текстур, так как многие текстуры получаются в результате воздействия жидкостей на какую-либо поверхность, например, таким образом можно получить эрозию. В последнее время подобное моделирование получило широкое распространение и в геофизике, в частности, при моделировании предсказания погоды. И, конечно, моделирование жидких сред важно для различных инженерно прикладных задач. Во многих инженерных пакетах программного обеспечения существуют готовые решения для гидродинамических симуляций. Распространенное мнение в научном сообществе, что уравнение Навье-Стокса хороши для моделирования движения жидкостей. Это подтверждают большое количество научных работ, учебников и статей, публикующихся в разных областях, но которые, тем не менее, используют численное решение уравнения Навье-Стокса как основу моделирования. Какой численный метод использовать на практике зависит во много от задачи и доступных вычислительных мощностей. Большинство инженерных задач требуют от симуляции точных значений различных физических величин, на основе которых принимаются решения о надежности, производительности и т.д. Визуальное представление решения («форма» потока) обычно вторичной важности в таких приложениях. С другой стороны в компьютерной графике наибольший интерес вызывают именно «форма» и поведение среды, а физическая точность вторична, а во многих случаях вообще не важна. В идеале необходимо предоставить пользователю набор интерактивных инструментов, который бы позволил ему легко внедрить моделирование и визуализацию таких сред в собственное приложение. Исторически так сложилось, что ранние модели сред (воды, дыма, огня) были основаны на внешнем виде, а не на физической симуляции. Потоки жидких и газообразных сред моделировались простыми примитивами, комбинация которых позволяла анимировать системы частиц [1, 3] или простую геометрию, такую как листья [4]. Визуальная насыщенность повысилась с появлением функции турбулентности [5], и долгое время такой подход был очень распространен в виду того, что функция турбулентности периодична в пространстве и времени и легко совместима с существующими методами текстурирования. Этот подход использовался во многих фильмах в 80-х – 90-х годах: «Трон», «Король Лев» и др. Однако у такого подхода есть 5 существенный недостаток – полное отсутствие взаимодействия с пользователем и внешней средой. Первые модели, использовавшие уравнения Навье-Стокса, были реализованы для двумерного случая [6] и использовали решение уравнения Пуассона для создания анимации двумерной жидкости. Однако этот подход был ограничен двумерным случаем, и авторы отмечали неустойчивость симуляции. Дальнейшие исследования продолжили Касс и Миллер в [7], где они предложили линеаризовать систему мелкой воды для моделирования жидкостей. Эта тема получила продолжение в работе [8], где применили эту модель для моделирования течения акварельной краски по холсту. Эта реализация использовалась в кино в 1998 году в фантастической мелодраме Винсента Уорда «Куда приводят мечты» («What Dreams May Come»). Фильм был удостоен премии «Оскар» за лучшие визуальные эффекты. Рисунок 1. Кадры из х/ф «Куда приводят мечты» (1998). Имитация рисования краской (на основе отснятого видеоматериала) В 1999 году в [9] был предложен вычислительно простой, легкий в интеграции и устойчивый при любых параметрах метод моделирования динамики жидких сред. В виду этих достоинств, данный метод, получивший распространенное название Stable Fluids, стал широко применим в различных интерактивных приложений, прежде всего игровых, и повлек за собой целый поток исследований: По использованию различных схем алгоритма обратной проекции [11], По использованию разных схем дискретизации и численных методов [12] По использованию различных граничных условий [10] По расширению применимости: для оригинального двумерного алгоритма был предложен трехмерный аналог [13] 5. Прочие модификации данного подхода: сложные граничные условия, использование графических процессоров для ускорения и т.д. 1. 2. 3. 4. В настоящее время Stable Fluids можно считать, де-факто, образцом, с которым все сравнивают новые результаты исследований в области моделирования и визуализации жидких и газообразных сред. 6 3. Постановка задачи Необходимо разработать программную библиотеку, позволяющую проводить моделирование и визуализацию течения жидкостей и распространения газов в реальном времени в двумерном и трехмерном случаях. Библиотека должна позволять загружать произвольную сцену, внутри которой в дальнейшем планируется проводить симуляцию, и в этой сцене устанавливать источник жидкости или газа, генерирующий в заданном направлении частицы среды. Библиотека должна обеспечивать гибкую настройку физических параметров моделирования, позволяющих найти компромисс между интерактивностью моделирования и визуализацией и качеством синтезируемого изображения. 7 4. Обзор существующих модификаций решений рассматриваемой задачи и ее Изначально спецэффекты в кино были полностью под контролем художника и режиссера. Все, что не снималось на камеру, а добавлялось на этапе монтажа, необходимо было добавлять в каждый кадр. Работа эта была ручная и занимала колоссальное количество человеко-часов. Очень быстро стало понятно, что можно использовать вычислительные возможности ЭВМ для того, чтобы упростить эту задачу. Использование компьютерной графики позволило привнести в киноиндустрию нечто новое и удивить зрителей необычными технологиями. 4.1 Шум Перлина 4.1.1. История появления Художественный фильм «TRON» (1982) был первым проектом с солидной порцией компьютерных спецэффектов. Вместе с тем, компьютерная графика того времени выглядела искусственно гладко и однообразно. С этой проблемой столкнулся Кен Перлин во время работы над фильмом «TRON». Недовольный неестественностью синтезируемых кадров Кен Перлин стал искать способ разнообразить получаемое изображение. В TRON были использованы не полигоны, а подход, именуемый конструктивной твердотельной геометрией (Constructive solid geometry, CSG), при котором все объекты моделировались как логические комбинации математических примитивов, таких как сферы, эллипсы, цилиндры и другие простые формы. Примеры таких операций приведены на рис. 2. а) логическое объединение б) логическое вычитание в) логическое пересечение Рисунок 2. Примеры операций CSG Это подтолкнуло Кена Перлинa искать решение в текстурировании объема, а не поверхностей. В 1983 году Перлин предложил простую псевдослучайную функцию для заполнения объема. Ключевым преимуществом его подхода перед традиционным текстурированием, доступным в современном графическом процессоре, являются: 8 1. Экономия памяти: все получаемые текстуры синтезируются, они не требуют места для хранения, что особенно критично для трехмерных текстур. 2. Больший период повторения. 3. Позволяет использовать четырехмерный шум, в то время как поддержка четырехмерных текстур отсутствует. 4. Качество фильтрации существенно выше, благодаря интерполяции более высокого порядка (см. рис. 3). а) традиционное текстурирование б) использование функции Перлина Рисунок 3. Пример текстурирования сферы без и с использованием функции Перлина Основные требования, которые предъявлялись к функции шума Перлина при разработке: 1. Внешне производит впечатление шума. 2. Контролируема: при передаче одинаковых параметров, возвращает одинаковые значения. Случайная функция Перлинa позволяла заполнить все трехмерное пространство. Срез значений этой функции показан на риc. 4. Она обладала еще несколькими интересными свойствами: 1. Периодичность в пространстве 2. Нулевое математическое ожидание 3. Отсутствие слишком высоких или слишком низких частот Наличие такой функции позволило продвинуться дальше. Рисунок 4. Двумерный срез шумовой функции Перлина 9 Сам по себе шум был не очень интересен, но его использование в сочетании с математическими выражениями позволило создавать интересные текстуры. 4.1.2. Алгоритм Шум Перлина – это отображение из пространства Rn в R. В настоящий момент наиболее распространенными значениями n являются {1, 2, 3, 4}. Шум ограничен в частотной области – практически вся его энергия, если рассмотреть шум как сигнал, сконцентрирована в малой частотной области. Высокие частоты, проявляющие себя как маленькие детали, и низкие частоты вносят небольшой вклад в общую энергию. Внешне это выглядит как белый шум после свертки с ядром Гаусса. Алгоритм Шума Перлина достаточно простой, рассмотрим его для пространства R2: 1. Рассматривается регулярная сетка 2. Для входной точки P определяются окружающие ее точки, лежащие на сетке. Таких точек 2n т.е. 4 для R2 3. Для каждой точки Qi i={1,2,3,4}, лежащей на сетке: a. Выбирается псевдослучайный вектор градиент G. b. Вычисляется скалярное произведение D = G * (P - Qi) 4. Получили Di i={1,2,3,4}, которые можно проинтерполировать: a. Вычисляются веса для S-curve интерполяции (3t2 – 2t3) в [15] b. В дальнейшем в [14] была предложена другая формула для S-curve коэффициентов: 6t5 - 15t4 + 10t3. Это вызвано тем, что вторая производная в верхней формуле не равна нулю при t = {0, 1}. Это вызывает видимые разрывы в освещении геометрии, вершины которой были сдвинуты, используя шумовую функцию (displacement mapping). c. 2n-1 линейные интерполяции. Рисунок 5. Иллюстрация шагов алгоритма Перлина (для двумерного случая) Для быстрого вычисления псевдослучайных градиентов был предложен следующий алгоритм: 1. Заранее рассчитывается 2 таблицы (в каждой таблице n записей): 10 a. Таблица случайных целых чисел P, в которой перемешаны числа от 0..(n-1) b. Таблиц случайных градиентов G c. В оригинальной работе n = 256 2. Для узла с целочисленными координатами {i,j,k} градиент можно вычислить по формуле: grad_vec = G[ (i + P[ (j + P[k]) mod n ] mod n ] 3. Такой подход был изменен в [14], где было предложено отказаться от таблицы случайных векторов G. Вместо этого Perlin предложил использовать 12 векторов, которые подобраны так, чтобы избежать корреляции между ними и координатными осями. Предложенные вектора направлены из центра куба [-1, 1]3 в стороны вершин. 4.1.3. Применение В природе многие явления обладают свойством самоподобия. Используя этот факт можно смоделировать интересные поверхности с помощью шума Перлина. Рассмотрим следующий пример: 1. Пусть дана функция noise(x) 2. Рассмотрим линейную комбинацию: BM ( x) n freq1 1 2 freq noise (2 freq x) 3. Такая функция (BM означает Brownian Motion – броуновское движение) выглядит уже гораздо лучше, что проиллюстрировано на рис. 6. а) б) в) г) д) е) Рисунок 6. Одномерная функция Перлина на разных частотах. а)-д) – первые 5 октав, е) – результирующая функция BM(x) 4. Аналогично можно получить функцию турбулентности: n 1 T ( x) freq noise (2 freq x) freq1 2 5. Используя различные комбинации функций можно получать различные материалы: Рисунок 7. Примеры имитации различных материалов с помощью шумовой функции 11 4.2 Использование уравнений в частных производных для моделирования движения газообразных и жидких сред Использование процедурных шумов стало новым словом в кинематографе. Следующим шагом эволюции технологии разумно было ожидать использование математического аппарата для более естественного моделирования. В основе этого моделирования лежит хорошо развитая теория гидродинамики, в частности, система уравнений Навье-Стокса. 4.2.1. Уравнения Навье-Стокса Объем жидкости или является сплошной средой. Применим метод конечных элементов – будем моделировать жидкость/газ системой частиц. Пусть частица – маленький шарик воды, который имеет массу m, объем V и скорость u . Чтобы проинтегрировать систему вперед во времени, необходимо обрисовать действия сил на каждую частицу. Второй закон Ньютона как раз говорит нам, как частицы ускоряются и откуда возникает движение: ma F , где под ускорением понимается производная Лагранжа по скорости: Du u a u u Dt t Рассмотрим, какие силы действуют на частицы: 1. В системе присутствует гравитация, т.е. на частицу действует сила тяжести. 2. Области высокого давления давят на области с низким давлением. Нас интересует общая сила, действующая на частицу, потому что, например, если давление по всем направлениям одинаково, то общая сила будет равна 0. На самом деле, важны только те ситуации, когда с одной стороны частицы давление больше, чем с другой. В этом случае частица начинает двигаться в сторону, где давление ниже. Т.е. нас интересует изменение силы, которое проще всего посчитать, взяв отрицательный градиент давления. Также необходимо проинтегрировать по всему объему, что проще всего сделать домножив все выражение на V. 3. Возникает еще одна сила из-за вязкости нашей жидкости. Вязкие жидкости пытаются противостоять деформации. Эту силу можно рассматривать как некоторую силу, которая пытается заставить частицу двигаться со средней скоростью окружающего потока, т.е. она пытается минимизировать разницу в скорости между частицой и близлежащими к ней частицами. Дифференциальный оператор, который вычисляет как далеки значения в некоторой области – это лапласиан. Вот откуда появляется третье слагаемое в нашем уравнении. Далее 12 нам также необходимо проинтегрировать по всему объему и домножить на µ – динамический коэффициент вязкого трения. Все это вытекает в следующую формулу: Du m mg Vp V u , Dt Разделив обе части уравнения на m V , получим: Du 1 g p u , где Dt В итоге, приходим к системе уравнений Навье-Стокса, записанной в общем виде: 1 u u u u p f , где f – суперпозиция действующих на частицу сил. t u 0 , уравнение неразрывности — число Рейнольдса — безразмерное соотношение, которое определяет стабильность системы. Re l В данной системе принимают участие следующие величины: u — вектор скорости, t — время, — коэффициент кинематической вязкости, — характерная скорость, ρ — плотность, p — давление, f — вектор плотности массовых сил, l — характерный размер Если рассмотреть одномерный случай, то не сложно убедиться, на сколько Re важный параметр: 1. в предельном случае, когда отсутствует диффузия ( =0), то изменение скорости по полю скоростей можно условно изобразить, как показано на рисунке. u u u Уравнение вырождается в t 13 Рисунок 8-а. Как видно из графиков (рис. 8-а), процесс симуляции быстро ломается. 2. в другом придельном случае, когда мы рассматриваем только диффузию и u u . уравнение вырождается в t Рисунок 8-б. Такое уравнение ведет себя устойчиво (рис. 8-б). 3. Это подталкивает нас к выводу, что для устойчивого моделирования необходима u u u u (рис. 8-в). составляющая диффузии: t Рисунок 8-в. 4.2.2. Метод Лагранжа Метод Лагранжа (названный так по имени французского математика) – это метод, с которым, наверняка, все хорошо знакомы. Он рассматривает пространство, как систему частиц. Каждая точка жидкости или твердого тела представляется, как отдельная частица со своими координатами и со своей некоторой скоростью. Симуляция твердых тел всегда обычно производится по методу Лагранжа, с дискретным набором частиц, которые жестко соединены в сеть. Численно, подход Лагранжа соответствует системе частиц (с или без соединения между самими частицами). 4.2.3. Метод Эйлера Метод Эйлера (названный так по имени швейцарского математика) использует подход, который обычно применяется для жидкостей. Вместо отслеживания каждой 14 частицы, как в методе Лагранжа, мы следим за фиксированными точками в пространстве и смотрим, как величины, характеризующие жидкость (такие, как плотность, скорость, температура и др.), измеренные в тех точках, изменяются во времени. Численно, подход Эйлера соответствует использованию фиксированной сетки, которая не изменяется в пространстве даже в то время, как жидкость протекает через нее. 4.3 Применение уравнений Навье-Стокса для задач нефотореалистичной визуализации 4.3.1. Алгоритм Интересное применение уравнениям гидродинамики было дано в [8]. Авторы предложили использовать уравнение «мелкой воды» для имитации различных техник рисования. Схема работы данного метода достаточно проста: 1. Изображение разбивается на отдельные области 2. Генерируется набор слоев для каждой области 3. Для каждого слоя отдельно от остальных запускается процесс имитации течения жидкости, который рассчитывает распределение пигмента 4. Для получения окончательного результата слои накладываются друг на друга с помощью модели Кубелки-Мунка В качестве входных данных в этом процессе принимаются параметры, которые отражают физические свойства бумаги, пигментов и др. Также при имитации используется маска мокрых областей для определения границы области, где вода может растекаться свободно. 4.3.2. Моделирование поверхности бумаги Анизотропность бумаги моделируется созданием в каждой точке случайным образом заданных определяющих направлений (волокон) с помощью шума Перлина, что позволяет достичь реалистичной симуляции наложения акварельных красок на бумагу. Движение жидкости в каждой точке потока описывается системой нелинейных дифференциальных уравнений Навье-Стокса, сведенных к системе уравнений «мелкой воды». Каждый слой имитируется с использованием трехуровневой модели (см. рис. 9): Уровень растекания воды, где вода с пигментом течет по поверхности бумаги по тем областям, которые помечены маской влажных участков. В процессе течения вода поднимает с поверхности бумаги пигмент и течет вместе с ним, перенося его на другое место. На этом уровне важны такие параметры, как скорость и давление воды, концентрация красителя и наклон (градиент высоты) бумаги. Уровень передвижения пигмента, где пигмент осаждается на бумагу и всплывает обратно (по законам процессов адсорбции и десорбции) 15 Капиллярный уровень, где вода впитывается в бумагу и распределяется в ней, происходит имитация движения воды по порам бумаги. Это позволяет маске влажных участков бумаги увеличиваться в размере. Рисунок 9. Схематическое изображение слоев трехуровневой модели из работы [8] Каждый пигмент перемещается между уровнем течения воды и уровнем перемещения пигмента посредством осаждения и всплытия. На осаждение и всплытие влияют свойства конкретного пигмента, такие как: густота, красящая способность и уровень зернистости. Функция капиллярного слоя состоит в том, чтобы позволять распространяться маске мокрой области благодаря капиллярному течению воды через поры бумаги. Существенные величины на этом слое – это: насыщенность водой бумаги, определяется как отношение объема воды к общему объему способность впитывания воды, определяется как объем воды, который еще может впитать бумага 4.3.3. Математическая модель Движение жидкости в каждой точке потока полностью описывается системой нелинейных дифференциальных уравнений Навье-Стокса в ее частном виде системы уравнений «мелкой воды». В двумерном случае для несжимаемых жидкостей, эти уравнения могут быть записаны так: u 2 uv p u u , t y x x v 2 uv p v v , t x y y Рассмотрим условия, которым должно удовлетворять поведение воды для достижения реалистичного эффекта: 16 1. Течение должно быть ограничено так, чтобы вода оставалась в пределах маски мокрой области. 2. Избыток воды в какой-то области должен вызывать течение воды из этой области в соседние и приводить к равновесию концентраций. 3. Течение должно периодически ослабляться, чтобы не допустить колебательных волн. 4. Течение должно искажаться из-за неровностей бумаги, что вызывает появление прожилок, параллельных направлению течения. 5. Локальные изменения должны носить глобальный характер (например, добавление воды в некоторую область должно отразиться на всей имитации). 6. Должно быть течение воды по направлению к краям для достижения эффекта их затемнения. Решение этих уравнений дает необходимые значения вектора скорости (u, v). Данная система решается методом Эйлера. y n 1 y n hf xn , y n ; Для численного решения использовалась следующая дискретная схема: u 2 uv ui2, j ui21, j (u, v) i 0.5, j 0.5 (u, v) i 0.5, j 0.5 ; A1 y x 2u 2u B1 2 2 ui 1.5, j ui 0.5, j ui 0.5, j 1 ui 0.5, j 1 4ui 0.5, j ; y x uin01.5, j uin0.5, j t A1 B1 pi , j pi 1, j ; v 2 uv 2 vi , j vi2, j 1 (u, v) i 0.5, j 0.5 (u, v) i 0.5, j 0.5 ; A2 y x 2v 2v B2 2 2 vi 1, j 0.5 vi 1, j 0.5 vi , j 1.5 vi , j 0.5 4vi , j 0.5 ; y x vin, j 10.5 vin, j 0.5 t A2 B2 pi , j pi1, j ; Перенос красителя на уровне растекания воды зависит от локальной скорости движения жидкости, которая рассчитывается на первом этапе имитации. 17 На каждом шаге какая-то часть красителя адсорбируется уровнем осаждения красителя, а другая путем десорбции возвращается обратно в раствор. Этот процесс описывается с помощью трех переменных: интенсивность адсорбции, интенсивность десорбции и грануляция. Последняя переменная определяет, как толщина и структура бумаги влияют на десорбцию красителя. Маска влажных областей бумаги может медленно расширятся за счет присутствия внутри бумаги капиллярных потоков. В отличие от уровня растекания, здесь поток воды обусловлен капиллярными эффектами. u v 0. С x y этой целью на каждом шаге выполняется процедура релаксации дивергенции, которая перераспределяет жидкость в соседние клетки до тех пор, пока дивергенция не станет меньше заданного значения ε. Пример работы алгоритма приведен на рис. 10. На каждом шаге должно быть выполнено уравнение неразрывности Так как вычислительная сложность алгоритма весьма высока, а размер сетки для моделирования в данной задаче совпадает с размером обрабатываемого изображения, то скорость работы приложения была далека от интерактивной. Тем не менее, метод успешно себя зарекомендовал и был использован в киноиндустрии. а) б) Рисунок 10. Пример работы алгоритма нефотореалистичной визуализации [8]. а) исходное изображение, б) результат 4.3.4. Выводы Технология в киноиндустрии прошла путь развития от практики, когда спецэффекты полностью создавали художники, до использования физического моделирования. В интерактивных приложениях до недавнего времени такая роскошь была недоступна. Однако, начиная с [12], где была описана реализация стабильного метода решения системы уравнений Навье-Стокса для современных центральных процессоров и для процессоров, в которых отсутствует АЛУ для вычислений с плавающей точкой, данная 18 техника стала доступна и в интерактивных приложениях, например, в видеоиграх. Вслед за [12], активизировались исследования в этой области, многие из которых взяли за основу изложенный подход. Данный метод быстро доказал свою состоятельность, получив практическое распространение в таких программных продуктах как «Maya» и «3ds max», в компьютерных играх и других приложениях. 4.4 Моделирование системой частиц В статье [20] был впервые представлен метод для моделирования таких природных феноменов, как облака, вода, дым, огонь и др., используя системы частиц. От привычных методов представления данных при синтезе изображений система частиц отличается по трем причинам. Во-первых, объект представляется не набором примитивов, таких как полигоны или патчи (параметрически заданные поверхности), которые определяют границу поверхности, а как некоторое облако простых частиц, которые определяют его объем. Во-вторых, система частиц – это не статичная сущность: частицы двигаются во времени, изменяют свою форму, «рождаются» новые частицы, а старые «умирают». Втретьих, объект, представленный системой частиц, недетерминированный, т.е. его форма не фиксирована, неопределенна до конца. Случайные процессы, происходящие вокруг, могут изменять эту форму и тем самым влиять на внешний вид объекта. Примеры: дым, огонь. При моделировании этих феноменов система частиц имеет ряд преимуществ перед классическими, ориентированными на использование поверхностей, техниками. Во-первых, частица (пока будем представлять ее, как точку в трехмерном пространстве) гораздо более простой примитив, чем полигон. Система частиц – это самая простая форма представления поверхности. Эта простота выливается в экономию вычислительного времени, и потому позволяет обрабатывать большую базу примитивов и получать более детальные изображения при синтезе. Так как частица очень проста, то легко смоделировать такие эффекты, как размытие при движении (motion blur) быстро движущихся объектов для удаления артефактов временнóй дискретизации. Второе преимущество заключается в том, что определение модели процедурное и может контролироваться генерацией случайных чисел (можно использовать тот же шум Перлина). Таким образом, получить высоко детализованную модель не требует затрат человеческого времени на дизайн. В этом плане такой подход существенно выигрывает по сравнению с системами, где моделируются поверхности. По этой же причине она может адаптивно менять уровень детализации, чтобы наиболее успешно балансировать производительность и качество, в зависимости от набора текущих параметров. Это чем-то похоже на фракталы, когда приближаясь к системе частиц, мы можем добавлять больше деталей. Еще одним достоинством системы частиц является то, что она позволяет моделировать «живые» объекты, которые изменяются во времени. Такую сложную динамику объекты, состоящие из поверхностей, моделировать не позволяют. 19 Идея моделирования поверхностей, как набора частиц, не нова. Пятнадцать лет назад, в самых ранних компьютерных видеоиграх взрывающиеся космические корабли были представлены большим количеством маленьких светящихся точек, которые наполняли экран. Такие точечные источники использовались в компьютерной графике в основном в симуляторах полетов. Однако более ранние публикации, чем статья [20], редки. 4.4.1. Общая схема работы системы частиц С течением времени частицы генерируются системой, двигаются, изменяются внутри системы и умирают в ней. Для того, чтобы посчитать на каждом кадре, нужно выполнить следующую последовательность действий: 1. Новая частица генерируется системой 2. Каждая новая частица получает свой набор атрибутов 3. Частицы системы, время жизни которых превышает максимальное, угасают 4. Оставшиеся частицы перемещаются согласно некоторым законам изменения 5. Финальное изображение «живых» частиц рисуется в буфер кадра Система частиц на каждом шаге может быть запрограммирована выполнять любую последовательность инструкций, поэтому ее процедурность позволяет внедрить любую вычислительную модель, которая описывает поведение, динамику или внешний вид объекта. Например, движение и трансформация частиц может быть привязано к решению систем дифференциальных уравнений. Или атрибуты частиц могут изменяться по законам какого-то стохастического механизма, например, тем же генератором шума Перлина. Мы можем использовать преимущества модели, которые уже были разработаны, в смежных научных и инженерных дисциплинах. В исследовании [20] был представлен простой стохастический процесс, в котором элементы на каждом шаге генерировались процедурно. Для контроля над результатом был введен набор некоторых параметров, которыми управлял дизайнер. Далее описывается некая базовая модель для системы частиц и даны некоторые ее детали. 4.4.2. Генерация частиц Частицы генерируются некоторой системой частиц, и процесс генерации состоит из нескольких этапов. Во-первых, надо определить сколько частиц будет в нашей системе. Самой простой вариант – это использовать некоторое постоянное количество частиц на каждом шаге. Однако, это не всегда удобно. Второй вариант – это когда дизайнер задает некий набор параметров, такие как: среднее количество частиц и допустимое отклонение от этого количества. Далее система генерирует случайное число в диапазоне [-1, 1] с нулевым математическим ожиданием. И на каждом шаге общее количество частиц определяется, как среднее плюс случайное число, умноженное на вариацию. При таком 20 подходе количество частиц будет изменяться со временем. И, наконец, третий вариант – это когда общее количество частиц зависит от того, какое пространство на экране занимает наш объект. Имеется в виду то, что нет смысла обрабатывать и рисовать сто тысяч частиц, если объект занимает на экране всего 4 пикселя. В этом случае удобно использовать гибридный подход, когда количество частиц определяется как во втором варианте, но все это еще пропорционально площади, которую занимает на экране вся система. Для того, чтобы позволить системе частиц угасать или, наоборот, расти со временем можно так же изменять параметры системы частиц (среднее количество частиц в системе и средняя вариация). Это позволяет дизайнеру контролировать появление и угасание частиц в пространстве. 4.4.3. Атрибуты частиц У системы частиц, как правило, есть набор собственных атрибутов, таких как: средний цвет и отклонение от него, положение в пространстве, направление движение (скорость), форма, в которой генерируются новые частицы и т.д. Сначала рассмотрим атрибуты каждой, отдельно взятой частицы: 1. Положение в трехмерном пространстве 2. Начальная скорость 3. Размер 4. Цвет 5. Прозрачность 6. Форма 7. Время жизни Параметры всей системы частиц так же управляют атрибутами каждой, отдельно взятой частицы. Например, позиция всей системы частиц в пространстве влияет на позицию каждой новой создающейся частицы. Кроме того, форма системы частиц, определяет регион, в котором могут рождаться новые частицы и расставляться в произвольных местах этого региона. Регионы обычно бывают простых форм: сфера радиуса R или диск радиуса R, прямоугольник или параллелепипед. Более сложные формы так же возможны, но строить их уже на порядок сложнее, и не всегда затраты на их использование оправданы. Форма определяет изначальное положение и направление скорости, по которой будут двигаться новые, рождающиеся частицы. При форме сферы, например, частицы будут двигаться из места рождения по радиусу. Если рассмотреть остальные виды форм, то частицы будут двигаться вверх по нормали, но возможны некоторые отклонения в зависимости от угла вбрасывания, который так же является параметром системы частиц. У каждой частицы так же есть скорость, которая определяется как средняя скорость системы частиц плюс некоторое случайное число, 21 умноженное на среднюю вариацию. Далее, говоря о системе частиц, будем употреблять термин «источник», а сами частицы будут называться просто частицами. Так вот, суть всего выше сказанного в том, что есть источник, обладающий набором точно таких же атрибутов, как каждая частица, но при этом они у него имеются в двух вариантах: среднее значение атрибута и допустимое отклонение атрибута. И для каждой частицы, чтобы получить ее значение атрибута, необходимо взять среднее значение того же атрибута источника плюс некоторая случайная величина в диапазоне [-1, 1], умноженная на значение вариации источника. Исключение составляют формы, т.е. если мы хотим не просто какую-то произвольную форму задать, а какую-то более интересную, то для этого надо воспользоваться какими-то другими законами задания форм. Например, сферическая форма и т.д. В данной статье использовались достаточно простые формы: сферические, прямоугольные, эллипсоидные. 4.4.4. Динамика частиц Отдельные частицы внутри системы частиц двигаются в трехмерном пространстве, изменяют свой цвет, прозрачность и размер. Для того, чтобы двигать частицу из кадра в кадр нужно просто напросто добавить вектор скорости к вектору положения. Но это слишком просто, и таким образом мы получим только поступательное, прямолинейное движение. Для того, чтобы это изменить система частиц может использовать какой-то ускоряющий фактор, для изменения скоростей частиц. Этот параметр дизайнер может использовать для того, чтобы имитировать силу гравитации или просто заставлять частицы двигаться по каким-то интересным траекториям. Цвет частицы тоже изменяется со временем по закону, который задает система частиц. Для прозрачности и размера все аналогично. 4.4.5. Умирание частиц При создании частицы ее время жизни измеряется в кадрах. Как только один кадр посчитан, текущее время жизни увеличивается, и как только оно достигнет максимально возможного, частица умирает. Другие механизмы позволяют убивать частицы, как только они перестают вносить вклад в изображение. Например, если интенсивность частицы уменьшилась до нуля или она стала полностью прозрачна, то она подлежит уничтожению. На ее место придет новая частица, что позволяет экономить вычислительную мощность. Кроме того, можно отсеивать частицы, которые находятся дальше некоторого расстояния. Такой механизм позволяет убивать частицы, которые находятся вне региона нашего интереса. 4.4.6. Отображение частиц Когда посчитано положение и внешние параметры каждой частицы, то уже необходимо производить синтез изображения. Эта задача намного более сложная, чем задача визуализации объектов, составленных из традиционных примитивов, таких как: 22 полигоны или кривые поверхности. Частицы могут закрывать другие частицы, могут находиться за ними, они могут быть прозрачны, могут отбрасывать тень на другие частицы, более того, они могут сосуществовать в сцене, где есть объекты, составленные из стандартных примитивов. В статье [20] было сделано 2 предположения, которые позволяли сильно упростить алгоритм визуализации системы частиц. Во-первых, считалось, что частицы не пересекаются с другой геометрией в сцене. Таким образом, не было необходимости обрабатывать случай, когда частица пересекает треугольник, и на этом месте появляется жесткая граница. Во-вторых, считалось, что каждая частица – это некий источник освещения. Таким образом, частица только добавляет свет к тому или тем пикселям, которые она закрывает. Частица, которая находится сзади данной, так же добавляет дополнительный свет, а не считается закрытой. Таким образом, освещенность только собирается, и цвет зависит от цвета частиц, которые попадают в этот пиксел и их прозрачности. Такой подход позволяет вообще не заботиться о правильном затенении частиц, но он имеет свои ограничения. В [20] рассматривались такие эффекты, как огонь и взрывы, для которых это работает хорошо. С другой стороны, для таких объектов как: облака, дым, вода, - такой подход совершенно не применим. Тем не менее, этот подход был успешно использован, при нем нет необходимости сортировать частицы, а они могут быть сразу выведены в буфер кадра, как только их значения посчитаны. Следующая работа по системе частиц в [21] развила данный подход. Были предложены так называемые системы частиц второго порядка, представляющие собой расширение классической системы частиц. Частицы, их источники и силовые генераторы объединяются в систему частиц второго порядка. Новизна этого подхода состояла в том, что помимо частиц присутствовали еще и силовые генераторы, или генераторы силовых полей, представленные как специальные частицы, которые могли быть точно так же созданы или удалены, но которые влияли на положение самих себя. В дальнейшем система частиц использовалась очень активно, в том числе и в [22], где системой частиц моделировались потоки жидкостей. Следует отметить, что система частиц – это инструмент, который использует библиотека Agea PhysX, с которой будет проведено сравнение моей работы. 4.5 Визуализация объемных данных Объемные данные представляют из себя некоторую скалярную функцию, заданную в R . Типичным источником таких 3D данных является набор двумерных срезов, полученных с помощью компьютерной или магнитно-резонансной томографии. Они, как правило, используют регулярную дискретизацию, т.е. имеется некоторый двумерный срез на каждый миллиметр, и в каждом срезе одинаковое количество пикселей. 3 23 а) б) Рисунок 11. Визуализация объемных данных. а) данные в виде трехмерной сетки, б) примеры функций интерполяции между узлами сетки Одной из проблем при визуализации таких данных является ре-дискретизация – т.к. в большинстве случаев данные заданы на регулярной дискретной сетке, необходимо как-то интерполировать данные между узлами. Реконструкцию функции можно произвести с помощью свертки с интерполирующим ядром. Простейшими интерполирующими ядрами могут быть: функция ближайшего соседа, трилинейная функция и функции более высокого порядка (трикубическая, sinc-интерполяция), как показано на рис. 11. Для визуализации объемов необходимо произвести следующие шаги: 1. Отобразить скалярное поле в оптические параметры, такие как цвет и прозрачность. 2. Вычислить уравнение синтеза (rendering equation) в [25]. L( x, ) Le ( x, ) ( x, , ) L( x , )( , n)d ' x (1) Величины в (1): L(x,φ) – общая излучательность поверхности исходящая из точки x в направлении φ L(x, φ)e – собственная излучательность поверхности Ωx – единичная полусфера вокруг точки х x - точка на первой поверхности которую пересекает луч исходящий в направлении θ n – нормаль к поверхности в точке х ρ(x,φ,θ) – часть света которая приходит в х по направлению θ и отражается по направлению φ Это уравнение примечательно тем, что вся сложность процесса передачи света описывается как рекурсивное интегральное уравнение, ядро которого может включать в себя всевозможные свойства материалов и функций видимости. Различные методы 24 визуализации могут быть рассмотрены как различные численные схемы решения уравнения (1). Кроме того, стоит отметить, что существуют разные оптические модели для визуализации объемов, однако они являются отдельной большой темой для исследования, и в моей работе это не затрагивается. Краткий обзор можно найти в [26]. А подробное исследование различных оптических моделей можно найти в [27]. Рисунок 12. Примеры методов визуализации объемных данных 3. Альтернативой визуализации объемов является извлечение поверхности уровня и визуализация ее стандартными примитивами (например, треугольниками). 4.5.1. Метод бегущих кубов Метод бегущих кубов (marching cubes) – это метод извлечения поверхности уровня, который является расширением алгоритма бегущих квадратов, используемый для построения линий уровня. Короткое описание алгоритма бегущих квадратов поможет лучше понять алгоритм бегущих кубов, поэтому рассмотрим сначала его. Пусть у нас есть двумерная сетка и в узлах этой сетки заданы значения некоторой функции, и нужно построить некоторую кривую, которая соответствует значению функции равному некоторой константе, т.е. построить изолинию или линию уровня (см. рис. 13). В каждой точке мы проверяем является ли значение функции больше, либо меньше нашего константного значения. И в случае, если мы на двух соседних точках получаем разный результат, то значит где-то между ними функция и принимает наше заданное константное Рисунок 13. Линия значение. Соответственно, существует 16 вариантов возможных уровня для таблично прохождений функции, представленных на рис. 14 (а), но заданной двумерной существует 2 случая, при которых невозможно сказать однозначно, как проходит функция. Альтернативные варианты функции 25 обозначены красными линиями на рис. 14 (б). а) б) Рисунок 14. Построение отрезков линии уровня по четырем значениям функции в узлах одной клетки сетки Алгоритм бегущих кубов [23] использует ту же самую идею, но в трехмерном пространстве. Здесь уже не 16, а 256 разных ситуаций, которые, на самом деле, используя соображения симметрии и поворотов, можно свести к 15 семействам, изображенным на рис. 15. а) б) Рисунок 15. Построение граней поверхности уровня по значениям функции на кубической сетке Для того, чтобы понять какую именно комбинацию нам необходимо выбрать, используют следующий подход: 1. Пусть мы ищем поверхность, заданную формулой f(x,y,z)=k. 2. Все 8 вершин куба упорядочиваются, как показано на рис. 15 (а). 26 3. Для каждой вершины vi вычисляется выражение bi = (f(vi) > k ). 4. получившийся набор {bi } образует восьмибитное целое число, в котором на месте i-ого бита стоит значение bi. 5. это число используется как представленным на рис. 15 (б). индекс в таблицу шаблонов (аналогичных 6. остается только рассчитать положение вершин для полигонов, как правило, это делается с помощью линейной интерполяции. 7. градиент скалярного поля так же является нормалью к гипотетической поверхности. Эту нормаль мы также интерполируем для последующего освещения. Недостатки этого метода: 1. много неоднозначных случаев, при которых невозможно восстановить поверхность (аналогично двумерному случаю) 2. В применении к научной визуализации этот метод работает хорошо. Однако для задач визуализации жидких и газообразных сред существует еще один недостаток, связанный с расчетом гладких нормалей: если расчет делается на CPU, то посчитать гладкие нормали труда не составляет, однако производительность оставляет желать лучшего. Если расчет делается на GPU, как например в [24], то информация о соседних кубах отсутствует, поэтому произвести сглаживание нормалей затруднительно. 4.5.2. Использование текстур 2D-текстурирование Современный графический конвейер не имеет встроенных средств для визуализации объемных данных, поэтому на заре визуализации объемов на GPU был предложен простой способ. Объемные данные представлялись в виде набора двумерных текстур. Эти двумерные текстуры можно было выводить на экран, используя простую геометрию (например, примитивы quads в OpenGL). Это имело определенные преимущества: 1. Производительность была выше, по сравнению с альтернативными программными подходами. 2. Позволяла использовать аппаратную билинейную интерполяцию. Однако, были и существенные недостатки: 1. При наличии только одного набора (принятое название – колода, от англ. deck) текстур, визуализация возможно только с ограниченного ракурса. При движении вокруг геометрии сильно видны артефакты. 27 Рисунок 16. Пример визуализации объема колодой текстур Поэтому требуется наличие нескольких колод, снятых с разных ракурсов, а это существенно увеличивает объем памяти. Тем не менее, такой подход успешно применялся в видеоиграх, например, для визуализации огня, когда пламя костра снималось на видео, а в игре визуализировалось, используя эту технику. 2. Даже при наличии нескольких колод проблема не исчезает до конца. При изменении угла обзора происходит выбор между колодами. Человеческий глаз воспринимает это переключение как разрыв в изображении, как показано на рис. 17. Этот разрыв вызван тем, что происходит считывание разных значений из текстуры. Рисунок 17. Артефакты при визуализации колоды текстур 28 Этот недостаток стало возможно устранить с появлением программируемого конвейера. Во фрагментной программе можно было произвести интерполяцию между двумя соседними слоями. 3D-текстурирование С появлением поддержки трехмерных текстур процесс визуализации объемных данных несколько упростился: 1. Появилась возможность использовать одну 3D текстуру, что экономит память 2. Аппаратная поддержка трилинейной интерполяции Визуализация объемов, используя 3D текстурирование, происходит следующим образом: 1. В зависимости от положения наблюдателя, на экран рисуется набор треугольников и четырехугольников, как показано на рис. 18. Рисунок 18. Визуализация объема с помощью 3D-текстурирования 2. Для обеспечения прозрачности эти слои могут быть отсортированы в порядке от дальнего к ближнему или от ближнего к дальнему. Недостаток этого метода заключается в том, что при перспективной проекции выборки из трехмерной текстуры происходят с нерегулярным расстоянием, как показано на рис. 19. Рисунок 19. Шаг выборки из трехмерной текстуры: регулярный при параллельной проекции (слева), нерегулярный при перспективной проекции (справа) 29 4.5.3. Трассировка лучей Трехмерные текстуры и программируемый конвейер, это все что нужно для того, чтобы отобразить объемные данные на экране. Однако ничего сложнее простой прозрачности подход 3D-текстурирования не дает. Для реализации даже простейших эффектов (затенение, простые модели освещения и т.д.), лучше использовать трассировку лучей. Трассировка лучей может быть выведена напрямую из уравнения синтеза изображений (1). Основная сложность при трассировке лучей при визуализации объемов заключается в процессе генерации лучей в пространстве объекта. В [28] был предложен следующий способ: 1. Текстурные координаты (для 3D-текстуры <s,t,r>) кодируются в цветовом атрибуте вершины: <R,G,B> = <s,t,r> (рис. 20). Рисунок 20. Цветовое кодирование координат 3D-текстуры 2. Определение входной точки: передние грани трехмерного куба рисуются во внеэкранный полноэкранный буфер RGB (обозначим его ORIG). Причем, получившуюся цветную картинку нужно воспринимать, как входную точку для луча в пространстве текстуры. 3. Определение направления луча: аналогично шагу 2 в другой внеэкранный буфер RGBA (DIR)рисуются задние грани куба. Вместе с этим считывается значение из ORIG и высчитывается нормализованный вектор направления. В alpha-компоненту записывается его длина. 4. Таким образом, в текстуре ORIG содержится отправная точка для трассировки лучей (Origin), а в DIR направление (Direction) и длина. 5. Передние грани куба растеризуется в буфер кадра. Используя нормализованные экранные координаты, можно обратиться в текстуры ORIG и DIR и составить параметрическое представление луча в текстурных координатах r(t)=ORIG[x][y][z]+t*DIR[x][y][z]. Дальнейшее развитие этот метод получил в [29], где данный подход был модифицирован для работы в случаях, когда передняя грань находится за ближней плоскостью отсечения. Данный подход получил широкое распространение и сейчас используется в игровых приложениях, например, как описано в [13]. 30 4.6 Выводы Историческая эволюция в этой области породила богатое наследие. Даже самые простые методы, которые использовали шумовые функции, тем не менее, на практике были успешно использованы в крупных коммерчески успешных проектах, чем и зарекомендовали себя как полезный инструмент. С появлением шумовой функции Перлина стал возможен синтез сложных детализированных текстур. Дальнейшее развитие естественным образом приводит нас к физическому моделированию (пусть и упрощенному) как к средству достижения большего реализма. Оба подхода Лагранжа и Эйлера обладают своими сильными и слабыми сторонами. Метод Эйлера позволяет построить решение уравнений Навье-Стокса, но ограничен неким объемом в пространстве. Кроме того как любой сеточный метод ему присущи артефакты дискретизации. Метод Лагранжа с другой стороны этими недостатками не обладает, но с помощью него очень сложно считать частные производные, необходимые для решения уравнений. В моей работе я предлагаю использовать комбинацию сеточного решения уравнения гидродинамики, систему частиц для визуализации и шумовые функции для предания большей детализированности. 31 5. Исследование и построение решения задачи В моей работе для моделирования жидких и газообразных сред я выбрала гибридный подход, в котором сочетаются решения уравнений для скоростей на трехмерной сетке и визуализация среды системой частиц. Точного решения система уравнений Навье-Стокса для интерактивных приложений не требуется. Ниже рассмотрим эту систему с точки зрения требований предъявляемых игровыми приложениями. 5.1 Интерактивное моделирование дыма. Хотя уравнения Навье-Стокса физически точны, на практике они не использовались для интерактивных приложений. Перелом произошел, когда в [12] был предложен вычислительно простой алгоритм для моделирования движения газа в двумерном случае. Представленный алгоритм был продолжением работ [9, 10] и отличался стабильностью при любом выборе параметров. Это позволяло делать существенно меньше итераций при численном решении, что и обусловило высокую экономичность данного подхода. 5.1.1. Математическая модель В этой статье автор представляет простое и быстрое приложение для реализации динамики жидкости для компьютерных игр. u u u 2 u f t ( 2) u k 2 S t ( 3) Математически состояние жидкости в любой момент времени моделируется как поле скоростей (задается функция, которая определяет для каждой точки пространства вектор скорости). Для того, чтобы лучше понять это, достаточно представить комнату с воздухом (множеством частиц - молекул). Каждая частица имеет скорость, которая может изменяться в зависимости от внешних условий: наличие батареи (источник тепла), присутствие сквозняка в комнате и др. Например, скорость воздуха вблизи обогревателя будет в основном направлена вверх, так как теплый воздух легче холодного. Распределение скоростей внутри комнаты очевидно также сложно, как описание распределения скоростей частиц дыма, поднимающегося вверх от зажженной сигареты, или движение частиц пыли в воздухе. Уравнения Навье-Стокса - точно описывают эволюцию поля скоростей с течением времени. При данных скоростях и силах уравнение говорит, как точно скорости будут изменяться через бесконечно малый промежуток времени. Уравнение вверху записано в компактной векторной форме. Очень грубо можно 32 сказать, что изменение скоростей происходит из-за 3х величин, стоящих справа от знака равенства. Но поле скоростей само по себе не слишком интересно, пока оно не начнет двигать какие-то объекты (частицы дыма, пыль или листья). Движение этих объектов вычисляется преобразованием скоростей вокруг объекта в телесные силы. Легкие объекты обычно просто двигаются по полю скоростей, так сказать, текут вдоль скоростей. В случае с дымом чересчур дорого моделировать каждую частицу по отдельности, поэтому они заменяются на плотности. Для этого вводится непрерывная функция, которая показывает, сколько дыма находится в каждой точке пространства. Обычно значения изменяются от одного до нуля. Эволюцию поля плотностей сквозь поле скоростей тоже можно описать математическим уравнением (нижнее уравнение), которое похоже на уравнение сверху. На самом деле, внизу более простое уравнение, чем сверху, так как оно линейное относительно плотности. Математическое представление уравнений для жидкости полезно только, когда размышляешь о жидкости в общем. На практике, конечно, нам необходимо конечное представление нашей жидкости. Обычный подход – это разбить все исследуемое пространство на равномерную сетку. Здесь будет рассмотрен простой для описания случай равномерной двумерной сетки, хотя ничего из описанного ниже не ограничивается этим упрощением. Пространство разбивается на сетку, по каждой оси на N+2 ячейки (рис. 21). Рисунок 21. Разбиение пространства сеткой Первый и последний столбцы и первая и последняя строки отводятся для граничных условий. Считается, что плотность и скорости постоянны в каждой отдельно взятой ячейке. Базовая структура решения следующая: начинаем с некоторых заданных значений для плотности и скоростей, затем постоянно обновляем их согласно событиям, которые происходят в окружающей среде. Считается, что между каждым циклом симуляции проходит время dt. 5.1.2. Движение плотностей Базовая структура решения уравнения для плотности. В каждый момент времени происходит 3 действия (в уравнении они находятся справа от знака равенства), показанные на рис. 22. 33 Начальная плотность Действие сил Диффузия Перемещение Рисунок 22. Схема алгоритма решения уравнения для плотности Как сказано выше, сначала будет описано решение уравнения плотности, двигающейся сквозь поле скоростей, которое не меняется во времени. В уравнении плотности (внизу) какое-либо изменение плотности может произойти по трем причинам, описанным справа от знака равенства тремя выражениями. Первое слагаемое говорит, что плотность должна двигаться по полю скоростей, второе – плотность может подвергаться диффузии, т.е. рассеиваться со временем, и третье – плотность может увеличиваться из-за присутствия источников плотности (например, сигарета – источник дыма). Обсуждение этих трех причин изменения плотности будет идти в обратном порядке. 5.1.3. Наличие источников плотности Это условие легко реализуемо. Мы предполагаем, что источник задан в некотором массиве s[]. В моей программе этот массив заполняется при движении пользователем мыши. Далее через каждый момент времени dt из этого массива часть плотности переходит в основной массив. 5.1.4. Диффузия Второй шаг - это диффузия. Диффузия происходит со скоростью diff (когда diff > 0 плотность будет распространяться по соседним клеткам). Рассмотрим, что происходит в отдельной ячейке. Будем считать, что ячейка обменивается только с 4 соседями, как это показано на рисунке. Таким образом, клетка теряет плотность, так как отдает ее 4-м соседям, но, в то же время, плотность увеличится за счет притока от соседей. x0 i 1, j x0 i 1, j x0 i, j 1 x0 (i, j 1) 4 xi, j Рисунок 23. Иллюстрация диффузии между соседними ячейками 34 Возможная реализация функции диффузии – это простое вычисление этих изменений в каждой клетке нашей сетки и добавление их с некоторым коэффициентом (скорость диффузии diff) к существующим значениям. Но, к сожалению, такая реализация будет плохо работать. Для больших значений параметра diff значения плотности начинают осцилировать, уходят в бесконечность, и процесс симуляции ломается. Такое поведение – это главный признак нестабильности метода. Главная идея стабильного метода следующая: результирующие плотности должны быть таковы, чтобы, если их прокрутить назад во времени, они бы привели к нашим начальным данным. x0 i, j xi, j a xi 1, j xi 1, j xi, j 1 xi, j 1 4 xi, j Это линейная система с неизвестным xi, j . Можно построить матрицу для этой системы и затем просто вызвать процедуру обращения матрицы. Однако, решать эту систему таким способом неудобно, так как матрица разряженная (лишь небольшое количество ее элементов не равно нулю). Поэтому будет использоваться простая итеративная техника обращения матрицы. Самый простой итеративный метод, который хорошо работает на практике, - это метод Гаусса-Зейделя. 5.1.5. Движение плотности по полю скоростей Последняя составляющая уравнения описывает движение плотности по полю скоростей. Можно было бы, как и на шаге диффузии, получить линейную систему и решить ее методом Гаусса-Зейделя. Однако, полученные линейные уравнения будут зависеть от скоростей, и это сильно усложнит решение. Есть способ эффективнее. Ключевая идея этого метода следующая: рассмотрим каждую ячейку, как частицу, обладающую неким свойством (свойством плотности) и способную это свойство переносить. Тогда достаточно промоделировать движение каждой частицы по полю скоростей. Но тут возникнет проблема, что придется производить обратное преобразование от частиц к сетке значений. Это уже не так просто сделать. Гораздо проще проследить из какой клетки (на самом деле, из каких клеток) пришла частица, т.е. следить за ее движением в противоположную полю скоростей сторону. Количество плотности, которое эта частица перенесет, получается просто в результате линейной интерполяции 4х ближайших соседей из ее стартовой позиции. Этот шаг получил название обратной проекции, а переход от метода Эйлера к модели Лагранжа – полулагранжевой схемы. Рисунок 24. Иллюстрация алгоритма моделирования движения плотности по полю скоростей 35 5.1.6. Решение уравнения для скоростей Рассмотрим, что собой представляет уравнение скоростей. Скорость в каждый момент времени изменяется, также как и плотность, по 3 причинам: присутствие внешних сил, которые увеличивают скорости, диффузия и движение поля. Первые 2 причины ничем не отличаются от случая для плотностей. Третья причина для скоростей с первого взгляда может показаться непонятной и не рассмотренной еще, но, если ее интерпретировать как факт, что поле скоростей движется вдоль себя, то она точно так же, как и первые две, сводится к решению рассмотренным выше способом. Есть только одно небольшое добавление. Поле скоростей должно удовлетворять следующему требованию: она должно сохранять массы переносимых им частиц (это требование берется из условия, что жидкость несжимаема). Каждое поле скоростей можно разложить на сумму несжимаемого поля (поля, сохраняющего массу) и градиентного поля (рис. 25). Рисунок 25. Разложение векторного поля в сумму несжимаемого и градиентного полей Таким образом, для того чтобы получить несжимаемое поле скоростей, нам достаточно вычесть из нашего текущего поля градиентное поле (рис. 26). Рисунок 26. Вычисление несжимаемого поля скоростей Не вдаваясь в детали, можно сказать, что решение этой проблемы связано с решением линейной системы уравнений, называемой уравнение Пуассона. Эта система разряжена, поэтому можно использовать метод Гаусса-Зейделя для ее решения. 5.1.7. Граничные условия Физическое моделирование обладает существенным преимуществом по сравнению с альтернативами (например, тот же шум Перлина) во многом благодаря тому, что 36 позволяет потоку взаимодействовать с окружающими объектами. С математической точки зрения, это взаимодействие выражается в выставлении граничных условий. Замкнутый куб (квадрат) Это самый простой вариант задания граничных условий. При таких условиях мы ожидаем, что поток будет отталкиваться от стенок куба (квадрата). Если рассмотреть поток, как набор частиц, то их движение можно сравнить с движением упругого мячика (рис. 27). Рисунок 27. Отталкивание частицы от стенки граничного куба При соударении, например, с горизонтальной стенкой горизонтальная составляющая скорости не изменяется, а вертикальная изменит свое направление на противоположное. С программной точки зрения такие граничные условия реализовать не сложно. Достаточно рассмотреть все клетки, находящиеся на границе, и заменить у них значения, указанным способом. Произвольные Для того, чтобы организовать произвольные граничные условия в двумерном случае достаточно нарисовать маску объектов, присутствующих в сцене, и модифицировать функцию установки граничных условий следующим образом: 1. Для каждой клетки в сетке N*N с индексами (i,j) проверяется значение в буфере маски. 2. Если оно «ложно», то данная клетка не является ни граничной, ни внутренней. 3. Если оно «истинно», то высчитывается нормаль, используя центральную разность. a. Если нормаль нулевая, то клетка находится внутри объекта, и необходимо обнулить скорости и любые другие параметры, например, плотность. b. Если нормаль ненулевая, то клетка лежит на границе объекта и среды. 4. Более общий алгоритм отражения потока представлен на рис. 28. 37 V V V|| Vr Vr Vr|| V dot V , n V|| V V Vr V Vr|| V|| Рисунок 28. Отражение потока от грани В моей системе был реализован двумерный случай с произвольными граничными условиями (рис. 29). Рисунок 29. Двумерная симуляция, реализованная в данной дипломной работе В трехмерном случае ситуация более сложная: существующие средства для создания полигональных моделей работают со стандартными примитивами, а для моей задачи необходимо выгрузить трехмерную сцену и получить ее воксельное представление. Процесс вокселизации должен быть достаточно быстрым, так как его потенциально необходимо будет повторять на каждом кадре. Ниже приведен краткий обзор существующих методов по вокселизации. Вокселизация 1. Построение воксельной сетки путем проектирования на грани куба 38 Для отдельно взятого объекта можно построить воксельную сетку, проведя ортогональную проекцию объекта на 6 граней куба. Рассмотрим в двумерном случае. Пусть дана модель, которую нужно вокселизовать. Спроецируем ее на две противоположные грани, мы получаем расстояние до контура объекта с двух его сторон. Если нам нужен цельный объект, то заполняем нашу сетку от контура до контур. Если же нам интересна только граница, то мы можем работать с первым представлением. Рисунок 30-а. Вокселизация произвольного объекта – шаг 1 Дальше повторяем то же самое, но с двумя другими противоположными гранями (для куба – четырьмя гранями). Рисунок 30-б. Вокселизация произвольного объекта – шаг 2 В результате, если нас интересует только граница объекта, то мы выбираем объединение, получившихся контуров. В случае же, если нас интересует объем, то мы должны взять пересечение, получившихся областей. 39 Рисунок 31. Вокселизация произвольного объекта – пересечение или объединение результата двух шагов (для получения границы или объема соответственно) У данного подхода есть очевидный недостаток: он не справляется с «дырявыми» объектами. Простейший объект, для которого будет получен неправильный результат, – это тор. 2. Построение воксельной сетки, используя растеризацию Данный подход является естественным развитием первого алгоритма. Для того, чтобы отлавливать дырки в объектах не достаточно сделать 6 проекций. В [13] был предложен следующий алгоритм. Объект, для которого стоится воксельная сетка, помещается в виртуальный куб. Воображаемые горизонтальные плоскости рассекают этот куб. Графический конвейер настраивается таким образом, чтобы, используя ортографическую проекцию, отрисовывать данный объект в разные внеэкранные буферы. Каждый раз ближняя плоскость отсечения передвигается к следующей виртуальной плоскости. Этого достаточно для того, чтобы получить правильные контуры. Для того, чтобы получить правильный объем используется буфер трафарета. Он инициализируется нулями, для передних граней его значение уменьшается на единицу, а для задних увеличивается на единицу. Более детальное описание алгоритма можно найти в [13]. Недостатком этого алгоритма является необходимость настраивать графический конвейер средствами OpenGL или DirectX. Кроме того, этот алгоритм ограничивает возможность построения нерегулярной структуры данных, что становится проблемой при использовании больших сеток. 3. Построение воксельной сетки, используя трассировку лучей Первый алгоритм не подходит для моей задачи из-за артефактов, которые он вносит. На момент исследований существующих подходов, второй алгоритм мог быть реализован исключительно в DirectX 10. Необходимой функциональности в 40 OpenGL не было. По этим причинам в моей работе предложено альтернативное решение. Данный подход очень просто реализуется. Пусть у нас есть сетка разбиения N*N*N. Кроме того, эта сетка привязана к некоторой коробке с ориентированными по главным осям в мировом пространстве гранями (AABB – axis aligned bounding box). Таким образом, каждому центру клетки воксельного объема можно поставить в соответствие точку в мировых координатах и размер клетки (ширину, длину, и высоту). Если задана аналитическая поверхность F(x,y,z)=0, то достаточно для каждой клетки подставить ее мировые координаты в уравнение и посмотреть на значение функции. При F(x,y,z)<D/2, где D – диагональ клетки, клетка лежит внутри либо на поверхности. Если объект задан, как набор треугольников, то тогда для каждого центра нужно определить: 1. Для каждого треугольника найти расстояние до плоскости, которую он задает. 2. Проверить, что проекция данной точки лежит в треугольнике. 3. Сохранить знаковое расстояние, если оно меньше по модулю предыдущего. 4. Перейти к проверке следующего треугольника. Таким образом, можно получить правильное представление объема с учетом всех внутренних дыр. Если нас интересует только граница объекта, то часть треугольников можно отбросить сразу на шаге 1, если посчитанное расстояние превышает D/2. Естественным недостатком этого алгоритма является его вычислительная сложность. При разбиении объема N*N*N и количестве треугольников равном M, вычислительная сложность равна O(N3M). Однако, есть простой способ этот алгоритм ускорить. Я реализовала вспомогательную структуру данных, условно названную иерархическим деревом. Правила построения данного дерева: 1. Дерево привязывается к той же AABB-коробке, что и воксельная сетка. 2. Дерево имеет ограниченную глубину. Типичными значениями глубины являются 1, 2, 3. 3. Каждый узел хранит указатели на треугольники, целиком лежащие в нем и не вмещающиеся ни в один из его дочерних узлов. 41 Рисунок 32. Иерархическое разбиение сцены Используя такую структуру данных легко сократить объем обрабатываемых треугольников. Так как существует соотношение между регулярной сеткой и иерархическим деревом, то каждая клетка будет искать расстояние только для тех треугольников, которые лежат в том же поддереве, что и она сама. На рис. 32 показано, что используя соответствие между регулярной сеткой и иерархическим деревом, можно ограничить количество проверяемых треугольников для каждой клетки. Такая оптимизация позволила ускорить работу от 8 до 12 раз, в зависимости от сложности сцены (. Сцена Регулярная сетка Регулярная сетка + иерархическое дерево ~1000 треугольников 5.6x 1.0x ~5000 треугольников 12.4x 1.0x Таблица 1. Зависимость времени обработки от размера сцены и метода Строить более сложную структуру данных не имеет смысла, так как предполагается, что вокселизацию придется повторять регулярно, на каждом кадре. Пример построения сложных граничных условий показан на рис. 33. Рисунок 33. Пример построения граничных условий для произвольной сцены 42 5.1.8. Визуализация В моей программе я реализовала 3 модели визуализации: 1. Визуализация 3D-текстурами Это результаты отрисовки дыма из моей библиотеки, с помощью 3D-текстур. На рис. 34-а приведен модельный пример, в качестве трехмерных данных был использован шум Перлина. Рисунок 34-а. Визуализация карты плотности с помощью 3D-текстур 2. Визуализация трассировкой лучей Аналогично на рис. 34-б приведены снимки экрана при работе моей программы с модельным примером, визуализирующим технику трассировки лучей. В качестве трехмерных данных опять же был использован шум Перлина. Рисунок 34-б. Визуализация карты плотности с помощью трассировки лучей 3. Визуализация системой частиц В моей программе я реализовала простое моделирование с использованием системы частиц. Этот подход дает существенные преимущества при визуализации дыма. Я использовала следующий алгоритм, описанный в [30]. Для того, чтобы 43 лучше понять его, рассмотрим сначала, как работает алгоритм затенения при трассировке лучей в объеме. Рисунок 35. Иллюстрация метода трассировки лучей Вдоль каждого луча, как показано на рис. 35, делается несколько шагов. На каждом шаге для выяснения затенения необходимо пустить дополнительный луч на источник света. Предложенный алгоритм позволяет взглянуть на эту проблему с другой стороны. Того же эффекта можно достичь, используя теневую карту. Метод предлагает для полупрозрачных частиц отсортировать их вдоль луча, являющегося полусуммой (или полуразностью) луча направления взгляда и луча, направленного на источник света. Частицы разбиваются на группы и последовательно рисуются в теневую карту, тем самым накапливая затенение, и в буфер кадра, где это затенение корректно учитывается. Кроме того, в моей реализации я использовала оптимизацию, описанную в [31]. Основной смысл этой оптимизации состоит в следующем: при визуализации большого количества полупрозрачных частиц основная нагрузка ложится на GPU-модуль, который отвечает за смешивание цветов. В [31] описан подход, в котором частицы рисуются во внеэкранный буфер меньшего размера, а потом получившееся изображение дыма накладывается на буфер кадра. Пример работы алгоритма из моей библиотеки показан на рис. 36. Рисунок 36. Пример визуализации дыма методом, основанным на работе [31] 44 6. Тестирование и сравнение Сравнение проводилось с библиотекой PhysX, т.к. это стандарт де-факто для физического моделирования в интерактивных приложениях. PhysX содерджит в себе следующую функциональность: 1. Модуль для работы с жидкостями. Моделирование в PhysX осуществляется с использованием системы частиц. 2. PhysX поддерживает так называемые силовые поля, аналог [21]. 3. PhysX поддерживает взаимодействие потоков с окружающей средой. 4. PhysX поддерживает ускорение вычислений на CUDA. 5. PhysX – устоявшийся пакет ПО, с развитыми средствами разработки и отладки. Недостаток состоит в том, что PhysX не имеет собственных средств визуализации, кроме самых примитивных. Рисунок 37. Примеры симуляции из PhysX SDK Моя библиотека имеет следующие преимущества перед библиотекой PhysX: 1. Есть готовые примеры по визуализации как объемных данных, так и систем частиц. 2. Два метода для моделирования – метод Эйлера или Лагранжа. При желании их легко можно использовать в комбинации. Недостатки моей системы перед PhysX в том, что она находится на ранней стадии развития и не имеет средств для отладки ПО, кроме самых примитивных. 45 7. Описание практической части 7.1 Схема работы программного решения Последовательность действий по работе с системой, проиллюстрированная на рис. 38. Создается произвольная сцена в 3ds Max. Далее эта сцена выгружается в виде текстового файла, формат которого совместим с форматом .OBJ файла, с помощью моего экспортера. Для загрузки в программу написан специальный класс. Дальше производится вокселизация, для того, чтобы в дальнейшем можно было правильно определять границы объектов и тем самым правильно задавать граничные условия. На полученной сетке можно производить моделирование жидких и газообразных сред, решая систему уравнений Навье-Стокса в трехмерном случае. Для работы с двумерным случаем предоставлены отдельные инструменты. В этом случае граничные условия могут легко задаваться в любом графическом редакторе. Также было реализовано 3 способа визуализации полученных во время моделирования объемных данных: визуализация 3Dтекстурами, визуализация трассировкой лучей во фрагментном шейдере и визуализация системой частиц. Рисунок 38. Диаграмма разработанного программного проекта 46 7.2 Реализация алгоритмов с использованием CUDA Трехмерное моделирование – крайне вычислительноёмкая задача, которая способна полностью нагрузить современный многоядерный процессор. Исследования в этой области давно переместились в сторону альтернативных вычислительных блоков, в первую очередь на графическом процессоре [32, 19, 13]. Выбор графического процессора не случаен: с одной стороны, GPU распространен практически в любом современном персональном компьютере, с другой стороны, архитектура GPU изначально была лучше приспособлена для выполнения SIMD операций. Это направление исследования получило название GPGPU или общие вычисления на GPU (от англ. general purpose GPU). Тем не менее широкого распространения алгоритмы GPGPU не получили, ведь зачастую нужно было проявить изрядную изобретательность, чтобы настроить нужным, весьма специфическим образом, графический конвейер, используя OpenGL или DirectX API. Следующим шагом в развитии этого движения стало появление в 2006 – 2007 году новой технологии CUDA, позволившей рассматривать GPU как сопроцессор, состоящий из потоковых скалярных процессоров. Преимущества CUDA перед графическими API заключаются в том, что CUDA несет меньше накладных расходов, т.к программный стек CUDA более легковесный по сравнению с OpenGL драйвером. Кроме того, в CUDA есть просто ряд возможностей, которые не доступны в OpenGL или DirectX. Существенным недостатком CUDA является ее зависимость от аппаратного обеспечения – CUDA работает только на GPU компании NVIDIA, на компьютерах с другой конфигурацией CUDA можно запустить только в режиме ЦПУ эмуляции. По сравнению с альтернативными решениями (Brook+), CUDA выглядит более зрелой и готовой к использованию: существует большое количество тренировочных примеров, компилятор nvcc существует уже больше двух лет. 7.2.1. Обзор технологии CUDA CUDA представляет собой программно-аппаратный стек, позволяющий рассматривать видеокарты серии Nvidia 8xxx и старше, как сопроцессор к основному процессору (device). Архитектура современной видеокарты устроена, как показано на рис. 39. В ней можно выделить крупный блок, который называется TPC (Texture Processor Cluster). Условно можно считать, что разные видеокарты отличаются друг от друга только количеством TPC. TPC состоит из двух крупных модулей – SM (Streaming Multiprocessor). В каждом SM-модуле 8 вычислительных процессоров – SP (Streaming Processor), которые умеют выполнять простые арифметические инструкции (MAD, MUL, MOV и т.д.), и один SFU (Special Function Unit), который позволяет вычислять сложные функции (SIN, COS, EXP, LOG и др.). 47 Рисунок 39. Архитектура современной видеокарты Все потоки группируются по 32 в так называемые warp’ы. Внутри warp’а потоки работают в режиме SIMD, но разные warp’ы могут исполнять разные инструкции. Поэтому GPU нельзя охарактеризовать, как классическую SIMD-ахитектуру. Warp’ы могут группироваться на более высоком уровне в блоки для того, чтобы использовать общую разделяемую память и иметь возможность синхронизироваться. Традиционно сложилось, что GPU используют арифметику с плавающей точкой и поддерживают стандарт вычислений float32 IEEE. В дальнейшем ожидается появление поддержки вычислений double-арифметики, что существенно расширит класс задач, для которых CUDA применима. С точки зрения программиста CUDA – это расширение синтаксиса языка C. Специальными служебными словами помечаются функции: функция вызывается и исполняется на CPU – __host__, функция вызывается на CPU, исполняется на GPU – __global__, функция вызывается и исполняется на GPU – __device__. Для переменных действует схожее правило. CUDA-программы компилируются специальным компилятором nvcc, который разделяет код на GPU и CPU составляющие. CPU код передается стандартному компилятору (gcc, IntelC и др.), а GPU код обрабатывается дальше. 7.2.2. CUDA в моделировании При анализе производительности моей программы я обнаружила, что основным узким местом является физическое моделирование. С точки зрения программного 48 решения, уравнения Навье-Стокса – это набор функций, каждая из которых в цикле выполняет одни и те же вычисления над разбиением пространства. В листинге 1 приведен пример функции diffuse (для простоты взят двумерный случай). Данная функция имеет тройной вложенный цикл, внутри которого происходят простые математические операции. Такого рода шаблон (цикл внутри которго, идет поток скалярных независимых инструкций) принято считать наиболее удачным для ускорения на CUDA. void diffuse ( int N, int b, float * x, float * x0, float diff, float dt ) { int i, j, k; float a = dt * diff * N * N; int kmax = (a < 0.001f) ? 1 : 20; for (k = 0; k < kmax; k++) { for (i = 1; i <= N; i++) { for (j = 1; j <= N; j++) { x[IX(i,j)] = (x0[IX(i,j)] + a * (x[IX(i-1,j)] + x[IX(i+1,j)] + x[IX(i,j-1)] + x[IX(i,j+1)])) / (1+4*a); } } set_bnd ( N, b, x ); } } Листинг 1. Функция diffuse для ЦПУ В CUDA используется иная модель программирования: в CUDA выделяют внутренние вычисления из цикла и ораганизуют их в так назывемые ядра (от англ kernel) – процедуры, которые будут выполняться на GPU. Вместо использования цикла, ядро запускается с параметрами, котороые указывают сколько вычислительных потоков необходимо запустить для параллельного выполнения на GPU. __global__ void diffuse_kernel (float { unsigned int gtidx = blockIdx.x * unsigned int gtidy = blockIdx.y * unsigned int tid; if ( (gtidx < gridSize-1 && gtidx (gtidy < gridSize-1 && gtidy * x, float * x0, float a, int gridSize) blockDim.x + threadIdx.x; blockDim.y + threadIdx.y; > 0) && > 0) ) { tid = _IX(gtidx, gtidy); x[tid] = (x0[tid] + a * ( x[_IX(gtidx, gtidy-1)] + x[_IX(gtidx, gtidy+1)] + x[_IX(gtidx-1, gtidy)] + x[_IX(gtidx+1, gtidy)])) / (1+4*a); } } 49 Листинг 2. Аналог функции diffuse в виде ядра Использование CUDA для моделирования дало существенный прирост производительности. В различных конфигурациях (зависит от аппаратуры и размера сетки) прирост варьируется от 2 до 10 раз. Это числа только для процесса решения уравнений Навте-Стокса. Дополнительный прирост производительности ощущается за счет того, что данные для моделирования хранятся на GPU и нет необходимости их пересылать каждый кадр. 7.2.3. CUDA для вокселизации На данный момент, вокселизация является самым вычислительно емким алгоритмом. Используя CUDA, удалось ускорить его более чем в 10 раз, однако, есть еще место для оптимизаций на уровне алгоритма, как для CPU так и для GPU. 50 8. Заключение Исторически сложилось, что моделирование и визуализация неразрывно связаны в задаче реалистичного синтеза жидких и газообразных сред. В данной дипломной работе были решены следующие задачи: сделан обзор различных алгоритмов моделирования и визуализации сплошных сред разработана библиотека с открытым исходным кодом, в которой реализован набор таких алгоритмов с использованием технологии CUDA для ускорения вычислений предложен и реализован гибридный подход, при котором моделирование происходит на замкнутой трехмерной сетке, а визуализация выполнена системой частиц, что позволяет добиться интересных визуальных эффектов (таких как самозатенение дыма) проведен сравнительный анализ с существующим аналогом – библиотекой PhysX. 51 9. Литература 1. Reeves W. Particle Systems. A Technique for Modeling a Class of Fuzzy Objects. // ACM Computer Graphics. 1983. 17. N 3. P. 359–376. 2. Shinya M., Fournier A. Stochastic Motion — Motion Under the Influence of Wind // Proc. of Eurographics. 1992 P. 119–128. 3. Sims K. Particle Animation and Rendering Using Data Parallel Computation // ACM SIGGRAPH Computer Graphics. 1990. 24. N 4. P. 405–413. 4. Wejchert J., Haumann D. Animation Aerodynamics // ACM SIGGRAPH Computer Graphics. 1991. 25. N 4. P. 19–22. 5. Ebert D., Musgrave K., Peachy D., Perlin K., Worley S. Texturing and Modeling: A Procedural Approach. Orlando, Florida: AP Professional, 1994. 350 p. 6. Yaeger L., Upson C. Combining Physical and Visual Simulation. Creation of the Planet Jupiter for the Film 2010 // ACM SIGGRAPH Computer Graphics. 1986. 20. N 4. P. 85–93. 7. Kass M., Miller. G. Rapid, Stable Fluid Dynamics for Computer Graphics // ACM SIGGRAPH Computer Graphics. 1990. 24. N 4. P. 49–57. 8. Curtis C., Anderson S., Seims J., Fleischer K., Salesin D. Computer-Generated Watercolor // Proc. of the 24th annual conference on Computer graphics and interactive techniques. 1997. P. 421–430. 9. Stam J. Stable Fluids // Proc. of the 26th annual conference on Computer graphics and interactive techniques. 1999. P. 121–128. 10. Stam J, A Simple Fluid Solver based on the FFT // Journal of Graphics Tools. 2001. 6. N 2. P. 43–52. 11. Selle A., Fedkiw R., Kim B., Liu Y., Rossignac J. An Unconditionally Stable MacCormack Method // Journal of Scientific Computing. 2008. 35. N 2-3. P. 350–371. 12. Stam J. Real-Time Fluid Dynamics for Games // Proc. of the Game Developer Conference. 2003 [PDF] (http://www.dgp.toronto.edu/people/stam/reality/Research/pdf/GDC03.pdf). 13. Crane K., Llamas I., Tariq S. Real-Time Simulation and Rendering of 3D Fluids // GPU Gems N 3. Massachusetts: Addison–Wesley, 2007. P. 633–675. 14. Perlin K. Improving Noise // ACM Transactions on Graphics. 2002. 21. N 3. P. 681–682. 15. Perlin K. An Image Synthesizer // ACM SIGGRAPH Computer Graphics. 1985. 19. N 3. P. 287–296. 16. Perlin K. Making Noise // Proc. of the Game Developer Conference. 1999 [HTML] (http://www.noisemachine.com/talk1/). 52 17. Perlin K. Course in Advanced Image Synthesis // ACM SIGGRAPH Conference. 1984. 18. N 3. 18. Green S. Implementing Improved Perlin Noise // GPU Gems N 2. Massachusetts: Addison– Wesley, 2005. P. 409–416. 19. Li W., Fan Z., Wei X., Kaufman A. Flow Simulation with Complex Boundaries // GPU Gems N 2. Massachusetts: Addison–Wesley, 2005. P. 747–764. 20. Reeves W. Particle Systems — a Technique for Modeling a Class of Fuzzy Objects // ACM Transactions on Graphics. 1983. 2. N 2. P. 91–108. 21. Ilmonen T., Kontkanen J. The Second Order Particle System // Journal of WSCG. 2003. 11. N 2. P. 240–247. 22. Van der Laan W., Green S., Sainz M. Screen Space Fluid Rendering with Curvature Flow // Proc. of the 2009 symposium on Interactive 3D graphics and games. 2009. P. 91–98. 23. Lorensen W., Cline H. Marching cubes: A high resolution 3D surface construction algorithm // ACM SIGGRAPH Computer Graphics. 1987. 21. N 4. P. 163–169. 24. NVIDIA Direct3D SDK 10 Code Samples, Metaballs [HTML] (http://developer.download.nvidia.com/SDK/10.5/direct3d/samples.html#MetaBalls). 25. Kajiya J. The rendering equation // ACM SIGGRAPH Computer Graphics. 1986. 20. N 4. P. 143–150. 26. Engel K., Hadwiger M., Kniss J., Lefohn A., Weiskopf D. Interactive Visualization of Volumetric Data on Consumer PC Hardware [HTML] (http://www.vis.unistuttgart.de/vis03_tutorial/). 27. Stegmaier S., Strengert M., Klein T., Ertl T. A Simple and Flexible Volume Rendering Framework for Graphics-Hardware-based Raycasting // Proc. of Volume Graphics. 2005. P. 187–195. 28. Kruger J., Westermann R. Acceleration Techniques for GPU-based Volume Rendering // Proc. of IEEE VIS. 2003. P. 38. 29. Scharsach H. Advanced GPU RayCasting // Proc. of CESCG. 2005. P. 69–76. 30. Kniss J., Premoze S., Hansen C., Shirley P., McPherson A. A Model for Volume Lighting and Modeling // IEEE Transactions on Visualization and Computer Graphics. 2003. 9. N 2. P. 150–162. 31. Cantlay I. High-Speed, Off-Screen Particles // GPU Gems N 3. Massachusetts: Addison– Wesley, 2007. P. 513–528. 32. Harris M. Fast Fluid Dynamics Simulation on the GPU // GPU Gems N 1. Massachusetts: Addison–Wesley, 2004. P. 637–665. 53