ENG Новый сайт

Меню сайта
Форма входа
Поиск
Помощь проекту
Награды

Победитель конкурса ЗАРЯ-2011 в номинации Открытие года (лучший сайт-новичок года)

Наш опрос
Что бы вам в первую очередь хотелось увидеть в новой версии SpaceEngine?
Всего ответов: 19093
Статистика
Locations of visitors to this page


Сейчас на сайте:
Онлайн всего: 2
Гостей: 2
Пользователей: 0

Сегодня нас посетили:

Всего зарегистрированных пользователей: 3919
3605
313

Блог

Главная » 2011 » Август » 02 » О эрозии на планетах
19:26
О эрозии на планетах
Для моделирования эрозии надо вычислять дифференциальные величины (например, разница высоты текущей точки и соседней) на каждой итерации, и таких итераций сделать несколько сотен. За одну итерацию рассчитывается распределение (перенос) материала из каждой точки в соседние. Для примера, ищите в гугле такие статьи по названиям: "Fast Hydraulic Erosion Simulation and Visualization on GPU", "Realtime Procedural Terrain Generation. Realtime Synthesis of Eroded Fractal Terrain for Use in Computer Game"

Т.к. процедурная планета генерируется не вся, а тайлами (блоками), то возникает проблема краевого эффекта. При генерации тайла ландшафта нет никакой возможности узнать, какой рельеф сбоку от этого тайла, если он ещё не сгенерирован. Для решения этой проблемы можно поступить так. Ограничим чило итераций например 50-ю. Тогда генерировать тайл надо с кромкой в эти 50 пикселей. Например, текстура 256*256 превращается в 356*356. Далее проводим 50 итераций эрозии (причём в каждой итерации материал переносится не более чем на 1 пиксель), а потом обрезаем тайл до 256*256. Когерентность и непрерывность фрактальных функций генератора гарантирует, что соседний тайл сгенерируется с точно такими же высотами, как кромка данного тайла, а кромка соседнего тайла так же, как центральные пиксели данного тайла. Поэтому после действия эрозии можно ожидать гладгоко и непрерывного "сшивания" соседних тайлов (кроме перехода между гранями куба - базовой фигуры для разбиения сферической планеты на квадратные тайлы).

О производительности алгоритма. Если судить по первой статье, 1 итерация водной эрозии на текстуре 512*512 занимает 2.38 мс. Тогда 50 итераций на текстуре 356*356 займёт 66 мс при линейной масштабируемости. Сейчас, без эрозии, текстура 256*256 генрируется за 1-2 мс. Таким образом, можно ожидать существенного (в десятки раз) увеличения времени генерации поверхности планеты (не времени рендеринга одного кадра, а времени генерации тайлов).

50 циклов это конечно мало, но достаточно для термальной эрозии (осыпания). Для локальной водной эрозии может быть тоже хватит. Но реки получить не удастся. Если от истока реки до её устья 6500 пикселей, надо провести как минимум 6500 итераций. Очевидно, с такой нагрузкой современное железо не справится. Тут можно вспомнить про то, что процедурная планета состоит из тайлов разного уровня детализации. Эрозию можно начинать просчитывать например с 5 уровня, когда становятся заметными горные массивы. При генерации следующих уровней уже сгенерированные используются как шаблон, следовательно их эрозия как бы уже учитывается.

Просмотров: 5154 | Добавил: SpaceEngineer | Рейтинг: 4.8/6
Всего комментариев: 4
1 Siciliec  
Совместить бы эрозию с динамическими реками.
http://vertexasylum.com/2010/10/30/gpu-based-water-simulator-thingie/
Там правда на DX всё.
ЗЫ:Что-то подобное можно увидеть в проекте From Dust.

4 mrmyasorybka  
ещё есть в Archane Worlds При том генерация планеты на нём очень похожа на генерацию здесь, но только без сложностей.

2 mikeZ83  
На разных планетах наблюдаются схожие слоеные горы-плато.Это связано с эрозей гор ветром,на разных высотах с различной интенсивностью,я правильно понимаю?

3 Hretgir  
просто нужной сначала провести генерацию краёв тайлов, чтобы можно было потом легко совместить их, а потом от краёв идти к середине

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]