Моделирование миров на GPU: четыре миллиарда лет за четыре минуты

Моделированиемировнаgpuчетыремиллиардалетзачетыреминуты

Аннотация

Этот пост углубляется в реализацию моего процедурного моделирования земли , полностью написанный фрагментными шейдерами GLSL. Он имитирует полную историю земной планеты за несколько минут, с обновлением симуляции на 90 кадров в секунду.

Видеозапись финального шейдера .

Протопланета

Эта история начинается с четырех с половиной миллиардов лет назад с куском расплавленной породы …

Ранняя Земля была протопланета , раскаленная докрасна и сильно испещренная ударами астероидов. Поскольку моя симуляция Земли полностью сгенерирована процедурно , без предварительно обработанных текстур, первая задача – создать карту этого ландшафта. Чтобы вычислить высоту местности на заданной широте itude и lon gitude, сначала переведите в трехмерные декартовы координаты:

  vec3 p = 1,5 vec3 (sin (lon PI / 640.) cos (lat PI / 360, грех (лат. *ПИ/180.), cos (lon PI / 640.) cos (шир. PI / .));   
 

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

  высота поплавка = 0 .;  for (float i = 0 .; i <5 .; i ++) {float c = craters (0,4 pow (2.2, i) p);  шум с плавающей запятой = 0,4 exp (-3. c) FBM (14. п);  float w = зажим (3. pow (0,4, i), 0., 1.);  высота + = w (c + шум);  } height = pow (height, 3.);   

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

  плавающие кратеры (vec3 x) {vec3 p = floor (x);  vec3 f = фракт (x);  float va = 0 .;  float wt = 0 .;  for (int i = -2; i <= 2; i ++) for (int j = -2; j <= 2; j ++) for (int k = -2; k <= 2; k ++) {vec3 g = vec3 (i, j, k);  vec3 o = 0,8 хэш 35 (p + g);  float d = расстояние (f - g, o);  float w = exp (-4. d);  va + = w sin (2. PI sqrt (d));  wt + = w;  } return abs (va / wt);  }  

Окончательная процедурно сгенерированная карта высот выглядит так:

Хотя относительно простой, после заполнения низменных областей водой, этот процедурный ландшафт напоминает то, что ученые верю, что ранняя Земля на самом деле выглядела так:

Художественный оттиск ранней Земли, выполненный НАСА .

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

Тектонический плиты

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

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

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

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

Гидравлическая эрозия

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

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

Эрозия вызывается закон мощности потока :

  высота - = 0. 07 pow (вода, 0,8) pow (наклон, 2.);   

Здесь высота и количество воды , расположенный в текущей ячейке, вместе с уклон в направлении движения воды. Снижение высоты ограничено, чтобы оно не становилось ниже места, куда течет вода.

Взаимодействие между водным потоком и эрозией приводит к естественному образованию речных бассейнов на местности:

По окраске соединенных водных путей (цвет определяется расположением устья реки) , можно создавать поразительные визуализации, напоминающие реальный бассейн реки карты :

Моделирование речных бассейнов. Исходный шейдер .
Бассейны рек США, по География кузнечиков.

Глобальный климат

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

Согласно с Климатическая поваренная книга , основные ингредиенты при создании карты MSLP - это расположение рельефа посреди океана и влияние широты. Фактически, если вы возьмете данные с реальной карты MSLP Земли, разделите местоположения в зависимости от того, являются ли они сушей или океаном, и нанесете MSLP на график в зависимости от широты, вы получите две синусоидальные кривые для суши и океана с немного разными формы.

Подбирая параметры соответствующим образом, я придумал грубую модель среднегодового давления (здесь lat itude измеряется в градусах):

  if (земля) {mslp = 1012. 5 - 6. cos (lat PI / 90.);  } else {// океан mslp = 1803. 5 - 30.  cos (lat PI / 33.);  }  

Конечно, этого недостаточно для создания реалистичной карты MSLP, поскольку генерация значений для суши и океана по отдельности приводит к резким разрывам на границах между ними. В действительности, MSLP плавно изменяется при переходе от океана к суше из-за локальной диффузии давления газа. Этот процесс диффузии можно довольно хорошо аппроксимировать, просто применяя Размытие по Гауссу для карты MSLP (со стандартным отклонением 14 - 15 градусов).

Чтобы учесть изменение климата вместе с сезонами, необходимо также смоделировать разницу в MSLP между январем и июлем. Опять же, наземные данные показывают, что это следует по синусоидальной схеме. Подбирая параметры и применяя размытие по Гауссу, это можно объединить с годовой картой MSLP для создания динамических климатических моделей, которые меняются в течение года.

  if (земля) {delta = 20.  sin (lat PI / 90.);  } else {// дельта океана = 30.  sin (lat PI / 40.) абс (лат) / 180 .;  }  

Теперь, имея под рукой MSLP, можно генерировать ветровые токи и температуру. На самом деле давление создает умеренный климат, но корреляция есть корреляция. Это потребует немного больше усилий для получения реалистичных значений ( сезон колеблется между -1 и 1 в течение года):

  Температура поплавка = 45.  tanh (2.2 exp (-0.5 pow ((широта + 5. сезон) /  ., 2.) )) - 30.  - (mslp - 1014.) / 1,8 + 1,5 земля - ​​4. высота;   

Ветер имеет тенденцию переходить от высокого давления к низкому, но в глобальном масштабе нам также необходимо учитывать Сила Кориолиса , которая вызывает циркуляцию ветра вокруг зон давления ( град - вектор градиента MSLP):

  vec2 coriolis = 30.  sin (lat PI / 360.) vec2 (-grad.y, grad.x);  vec2 скорость = кориолис - град;   

Хотя это относительно грубое моделирование, оно генерирует замечательно реалистичные схемы ветровой циркуляции. Если вы присмотритесь, вы можете заметить воспроизводство ряда природных явлений, включая изменение направления ветров над Индией в сезон дождей:

В качестве последней детали, осадки можно смоделировать путем переноса водяного пара из океана через векторное поле ветра на земля:

Адвекция реализуется аналогично моделированию жидкости:

Жизнь

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

  float dx = plant_growth - cy;  float dy = воспроизводство cx - хищничество cz - 1 .;  float dz = хищник cy - 1 .;  float dt = 0,1;  c.xyz + = dt c.xyz vec3 (dx, dy, dz);   

xyz элементы c представляют популяции растительности, травоядных и хищников соответственно. В большом масштабе динамика популяций животных порождает интересные закономерности:

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

Спиральные волны в колониях плесени .

Человечество

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

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

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