ПрограммированиеФорумГрафика

Облака

Страницы: 1 2 Следующая »
#0
23:50, 29 мая 2013

Привет народ.
Давайте обсудим как в наше время делать объёмные облака?
Есть что-то приличнее/интереснее частиц/мягких частиц?

Из последнего что видел понравились облака в скайриме, но я не уверен что они там объёмные (самолётов там всё же нету, драконы не в счёт).

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

upd: статью мисс Вонг я видел, но у неё по сути частицы, только рисуются по предрассчитанным в 3д максе координатам (если не ошибаюсь).

пример: http://www.youtube.com/watch?v=-FYh7uGu0_E&feature=youtu.be&t=2m10s

#1
1:31, 30 мая 2013

KaronatoR
> Земля уже есть (генерю процедурно зетмапы на гпу =)).

Покажи, если не стесняешься.

#2
9:05, 30 мая 2013

Тут два варианта - купить Simul Weather( или другое API для 3д облаков), или делать самому.
Самому - делать очень и очень тяжко - т.к. даже простой скаттеринг сделать проще в 100500 раз.
Копать нужно в сторону 3Д текстур - вокруг камеры рисуем сетку так :
представим себе цилиндр - мы в центре - теперь убираем верх и низ. Получаем колечко. Теперь рисуем таких колец - очень много - штук 16-32 - но каждое новое чуть больше предыдущего - так что в центре самое маленькое.
Это будет каркас для рендера 3Д текстуры. Теперь пуская луч через текстуру - получаем точку - знаем плотность облака в этой точке. Теперь пускаем луч от солнца в эту точку - каждую точку с ненулевой плотностью облака - суммируем - в итоге мы знаем какая часть света достигла эту точку.
Далее - теперь нужно учесть энергию света от нашей текущей точки - ведь она тоже освещает другие. Вот это и есть скаттеринг )))
Т.е. 3Д текстура + грамотный скаттеринг = неплохие 3д облака. А кто говорил что просто?
Кстати - то что я описал - юзают в Simul Weather )) Знаю, т.к. разбирал по кускам.

#3
9:56, 30 мая 2013

fzr125
Посмотрел Simul Weather...знаешь, а очень даже ничего.
Интересно, есть где стырить?
Я то для души пишу, мне пофиг на всякие лицензии =)

И ещё интересно, как он интегрируется с движком, например если я хочу тени на земле от облаков, то нужна карта плотности облаков.

#4
9:56, 30 мая 2013

fzr125
А ты работал с этой штукой?

#5
13:52, 30 мая 2013

fzr125
> Кстати - то что я описал - юзают в Simul Weather )) Знаю, т.к. разбирал по
> кускам.

А там CUDA или обычные шейдеры? Потому как обычно пишут все эти вещи люди далекие от игровых движков и все считают на OpenCL или CUDA, что неприемлемо для GD.

Могу сказать по опыту, что скаттеринг посчитать - это не проблема, проблема посчитать 3Д текстуру для глубины, да еще и быстро. Я посчитал сколько на рендер всего этого уйдет и сделал облака без скаттеринга пока.

#6
14:02, 30 мая 2013

Osiris
Это с какого перепугу OpenCL не применим в GD?

#7
14:04, 30 мая 2013

KaronatoR
> Это с какого перепугу OpenCL не применим в GD?

Потому что тоже самое на шейдере будет работать 100% везде, дрова будут вылезаны, а OpenCL все зависит от дров к железу, а еще забудь про консоли если что.

#8
14:06, 30 мая 2013

Osiris
Ну хорошо, с аргументом про консоли согласен. )

#9
14:36, 30 мая 2013

KaronatoR
А еще скорость работы OpenCL / CUDA сильно зависит от архитектуры процессора, а именно насколько сильно интегрированы друг в друга CPU и GPU, все старые кристаллы не очень хорошо справляются с распределенной работой вычислений, и тут дрова не помогут. А вот если все скормить GPU не очень сильному, то производительность будет выше.

Но если ты рассчитываешь на новые консоли - то как раз оно.

#10
16:19, 30 мая 2013

что за музыка в этом ролике: http://www.youtube.com/watch?v=-FYh7uGu0_E&feature=youtu.be&t=2m10s

#11
20:39, 30 мая 2013

KaronatoR
> Интересно, есть где стырить?
Нигде, к сожалению.

Но насчет тормозов - это да - будет дико тормозить.
Можете http://www.simul.co.uk/cloudwright вот тут затянуть пробник - но даже на 9600ГТ тормоза.
Osiris
> А там CUDA или обычные шейдеры?
там шейдеры не спрятаны - fx,cg - юзают DX как GAPI.

Но чтобы получить такое качество, на такой скорости - понадобится Титан наверное.

Я бы сделал так - для кучевых 3д облаков заюзал частицы, а для верхнего слоя - 2,5D текстуру =)
На частицах тоже можно замутить вполне вкусные облака :
http://www.youtube.com/watch?v=yhBhOPLIuDY
Вот это сделано на том, о чем писала мисс Вонг. Где это API скачать я не знаю - но вроде не сложно найти и посмотреть что да как.
Вот тут есть сырцы и демка этого алгоритма - не сложный, но и не слишком быстрый.
http://www.gamedev.net/page/resources/_/technical/game-programmin… ighting-r2273

Я делал облака в свое время очень долго. Остановился на том - что слепил 2,5Д - т.к. камера никогда не будет летать среди облаков. Так вот что я хочу сказать - сделать 3Д облака - чтобы как в жизни и чтобы не тормозило на среднего класса видеокартах - практически невозможно. Придется делать выбор - между качеством и скоростью. Вон, ребята из мелкософта - сильно не заморачивались для MS FlightSimulator - и взяли частицы и алгоритм Вонг - и ничего - продукт разошелся, как горячие пирожки.

KaronatoR
> А ты работал с этой штукой?
Я "работал" с cloudwright. Выше ссылку дал - можете сами скачать и "поработать".

Osiris
Ну как я уже писал - если камера не будет летать через облака - само круто - это юзать 2.5Д текстуры - суть такова - что юзаем просто шумовую текстуру для облаков - но с хитрым шейдером.
Вот мои скрины :
раз, дватри
За качество сорри, влом было открывать проект и крутить текстуры и шейдеры.

#12
12:21, 31 мая 2013

Для авиасима ни метод описанный fzr125 вначале, ни 2.5Д, наверняка, не подойдут.

1. Нужно покрыть облаками большУю площадь. 3Д текстура - хорошо. Но всем понятны причины, по которым мы не можем полноценно ее использовать. Какой размер? Сколько выборок делать, чтобы получить плотность в данной точке? А если это кучевые облака?
2. Необходим объем, т.к. будем летать в них.

Я, для схожей задачи выбрал Mega Particles, хотя впоследствии они были очень сильно видоизменены, практически неузнаваемы.
Разбиваем наш объем с помощью октри для фрустум кулинга, лодов, сортировки и для воксельного представления облаков (если выбираем его). Если мы выбираем представление облаков по заранее созданным мешам, то разбиваем объем неглубоко, расставляем меши. Неплохой метод освещения таких облаков описан в доке "Interactive multiple anisotropic scattering in clouds" результат очень реалистичный, если упростить некоторые моменты (light transport, multiple anisotropic scattering и forward eye scattering) то получается еще и быстро. Коротко суть метода. Облако представляется как некоторый объем с наложенной на него шумовой текстурой и текстурой нормалей. Мultiple anisotropic scattering можно предпросчитать, ну или считать редко в фоне, в зависимости от движения солнца. Forward eye scattering считается в риалтайме на гпу. Контур облака обклеивается небольшой 3Д текстурой и производится гипертекстуринг (экономия памяти, конечное число выборок гипертекстуринга). Трансформируя такие объемы, можно добиться неплохой неоднородности.

Но хочется, чтобы облака были полностью неоднородными, да еще и с возможностью анимации ("созревание","растворение", движение). Поэтому с помощью 3Д (4Д если нужна анимация)  исправленного шума Перлина (+процедура для облаков) бьем пространство до нужного уровня детализации. Используем умное разбиение, если шум имеет большее  значение определенного порога, то не бьем его. Также имеем порог для появления вокселей, который будет влиять на то, что облака будут более однородные/кучевые. Генерируем воксели, сферы Mega Particles можно заменить обычными билбордами с текстурой глубины/нормалей. Пушистость делаем гипертекстурингом по краям . Forward eye scattering делаем отдельным проходом, в небольшую текстуру. Multiple anisotropic scattering считаем в фоне, редко. В дальних лодах уменьшаем плотность, подставляем импосторы. Делалось все на ДХ9, с переходом на ДХ11 все упроститься.

Вот некоторые доки по теме:
"Практическая модель динамических атмосферных явлений при визуализации открытых пространств в системах визуализации реального времени" Н.А.Елыков, И.В.Белаго, С.М.Козлов С.А.Кузиковский, М.М.Лаврентьев
"Interactive multiple anisotropic scattering in clouds"
"Realistic and Fast Cloud Rendering" Niniane Wang
"Real-Time Cloud Rendering for Games" Mark J. Harris
"A Simple, Efficient Method for Realistic Animation of Clouds" Yoshinori Dobashi, Kazufumi Kaneda, Hideo Yamashita, Tsuyoshi Okita, Tomoyuki Nishita

#13
13:11, 31 мая 2013

fzr125
> Вот мои скрины :

Слабенько ) Приемлемо для игры на земле, но в небе весьма слабо. No offense.

Femidko
Можно увидеть результата работы метода?

>Делалось все на ДХ9, с переходом на ДХ11 все упроститься.
А как упроститься?

Вообще я использую у себя облака на системах частиц. Рендер - один DIP instance billboard (до 100 частиц) на облако и все довольно быстро, можно вообще за одни DIP вывести. Но это пока нет scattering. Стоит только о нем подумать как появляется необходимость объема для облака, а это уже не тривиальная задача, особенно как описал ее Femidko.

Есть очень простая техника для получения глубины на GPU - Opacity Mapping, но так как мы работает с частицами и не одной а на весь экран, то получаем жуткий over draw пока рендерим все текстуры. Про остальные методы в таком случае я вообще не говорю, особенно в основе которых CPU вычисления, они вообще выносят мозг.

#14
13:21, 31 мая 2013

fzr125
Большое благодарное спасибо за столь подробный ответ.
Облачка у тебя ничего, но у меня в том то и беда, камера среди них летать будет (

Femidko
Скрины в студию =)

Страницы: 1 2 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.