ФОРУМ

Список разделов форума => Статьи => : Robot 11 Apr 2010 - 23:44:10



: Визуализация водной поверхности. Быстрое преобразование Фурье на GPU
: Robot 11 Apr 2010 - 23:44:10
Визуализация водной поверхности. Быстрое преобразование Фурье на GPU
Дмитрий Трифонов "DikobrAz"

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


http://www.uraldev.ru/articles/id/35 (http://www.uraldev.ru/articles/id/35)


: Визуализация водной поверхности. Быстрое преобразование Фурье на GPU
: Mikle 12 Apr 2010 - 14:59:50
Машина:
Core2 Quad Q6600, 4Gb Dual DDR2 800, GF9600GT 512Mb
На WinXP SP3 запустилось, показало всё, кроме воды, во всех четырёх режимах 700+ fps.
На Win7 воду видно, 220, 145, 50 и 18 fps соответственно.
Очень понравилась геометрия волн, хороший спекуляр.
Отражения замка оставляют желать лучшего.
Отражения облаков совершенно не сочетаются с неестественно ровной и длинной солнечной дорожкой.
Преломления оценить невозможно из-за высокой мутности воды и невысокой детализации подводной части рельефа. Каустиков, видимо, нет.


: Визуализация водной поверхности. Быстрое преобразование Фурье на GPU
: Sergio 12 Apr 2010 - 15:37:03
Геометрия воды прикольная - выглядит красиво. Но в статье как-то мало рассказано именно о FFT, я ожидал более подробного объяснения


: Визуализация водной поверхности. Быстрое преобразование Фурье на GPU
: DikobrAz 12 Apr 2010 - 16:48:49
Спасибо за отзывы  

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

Про FFT могу накидать материалов. Как правило, они связаны с обработкой изображений, некоторые фильтры эффективно делаются с помощью FFT и сверток. Для 3D визуализации, толком, даже не присоветую ничего более.

Выложил ролик, если у кого будут проблемы с запуском: http://www.youtube.com/watch?v=Uk4EYHdn0Ac (http://www.youtube.com/watch?v=Uk4EYHdn0Ac)


: Визуализация водной поверхности. Быстрое преобразование Фурье на GPU
: keYMax 13 Apr 2010 - 22:51:16
Красиво  При больших значениях высоты волн все превращается прям в торнадо. Даешь девятый вал!   От формул реально голова опухла  

на dual core 2.6 ghz и gf9600gt от 400 до 43 фпс в зависимости от режима


: Визуализация водной поверхности. Быстрое преобразование Фурье на GPU
: Mikle 13 Apr 2010 - 23:13:39
[!--quoteo--][div class=\'quotetop\']Цитата[/div][div class=\'quotemain\'][!--quotec--]не стоило флудить про отражения и преломления[/quote]
Отражения и преломления основаны на отрендеренной в текстуру карте и нормалях воды, они показывают, насколько реалистичны эти нормали. Я увидел очень хорошую геометрию и плохие отражения от неё, что меня удивило. Далее я понял, что ты, видимо, сделал отражения и преломления "по быстрому", как не относящиеся к теме статьи. Лучше было, видимо, вообще их не делать, раз цель статьи - демонстрация генерации геометрии, которая, повторю, очень хороша.
И ещё. Поясни, плиз, этот абзац:
[!--quoteo--][div class=\'quotetop\']Цитата[/div][div class=\'quotemain\'][!--quotec--] Рисование всей сцены в кубическую текстуру для создания динамических отражений невозможно, потому что кубом придется объять слишком большую область, занимаемую водоемом. Использование техники для визуализации отражений от плоского зеркала с использованием буфера маски тоже не годится, потому что с нельзя наложить рябь или каким-либо другим образом деформировать полученное отражение.[/quote]


: Визуализация водной поверхности. Быстрое преобразование Фурье на GPU
: DikobrAz 14 Apr 2010 - 00:59:21
: Mikle
Отражения и преломления основаны на отрендеренной в текстуру карте и нормалях воды, они показывают, насколько реалистичны эти нормали. Я увидел очень хорошую геометрию и плохие отражения от неё, что меня удивило. Далее я понял, что ты, видимо, сделал отражения и преломления "по быстрому", как не относящиеся к теме статьи. Лучше было, видимо, вообще их не делать, раз цель статьи - демонстрация генерации геометрии, которая, повторю, очень хороша.

Карта нормалей вычисляется по карте высот. В демке она вычисляется не отдельным FFT, а по карте высот, это менее точно, но вряд ли из-за этого проблемы.

Я думаю, они тебе не понравились, потому что сильно заблюрены(текстура отражений низкого разрешения, условно) и потому что в демке косяк, который я не заметил, когда отправлял(не поменял режим отсечения). Поэксперементировав, я решил специально так сделать(не косяк разумеется), потому что когда натягиваешь текстуру с отражениями на сильно рельефную поверхность это создает неприятный "эффект ковра"  (как будто мы привязали текстуру отражений к поверхности воды). Согласен, что это не самый продвинутый способ бороться с этим эффектом, но на мой взгляд лучше, чем если не вносить никаких изменений в технику наложения отражений. Может быть, через некоторое время будут доступны техники создания отражений на основе трассировки лучей.

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

[img]http://upload.wikimedia.org/wikipedia/commons/thumb/6/67/Cube_mapped_reflection_example.jpg/220px-Cube_mapped_reflection_example.jpg\" border=\"0\" alt=\"\" /]


: Визуализация водной поверхности. Быстрое преобразование Фурье на GPU
: Mikle 14 Apr 2010 - 11:32:26
[!--quoteo--][div class=\'quotetop\']Цитата[/div][div class=\'quotemain\'][!--quotec--] Как использовать кубическую текстуру для задания отражений на обширных водоемах неясно[/quote]
Не ясно зачем это нужно. Обычная проективная текстура в данном случае предпочтительнее.
[!--quoteo--][div class=\'quotetop\']Цитата[/div][div class=\'quotemain\'][!--quotec--]Я думаю, они тебе не понравились, потому что сильно заблюрены[/quote]
Нет. Дело в том, что спекуляр света - это, в сущности тоже отражения (солнца). Анимация спекуляра и отражений должна совпадать по крайней мера для удалённых объектов, ведь она отклоняется одними и теми же нормалями, а она совершенно не похожа, как будто в отражениях где-то допущена ошибка.
[!--quoteo--][div class=\'quotetop\']Цитата[/div][div class=\'quotemain\'][!--quotec--]как сделать так, чтобы отражения соответствовали объектам на их границе с водой[/quote]
Это будет с моей статье, я как раз уделил внимание всему, кроме геометрии и света.


: Визуализация водной поверхности. Быстрое преобразование Фурье на GPU
: DikobrAz 14 Apr 2010 - 12:54:42
: Mikle
Не ясно зачем это нужно. Обычная проективная текстура в данном случае предпочтительнее.
С обычной текстурой, в принципе, нельзя получить реальные отражения. С кубемапой тоже, но это приближение лучше. Для воды, по всей вероятности, технику никак не использовать.

: Mikle
Нет. Дело в том, что спекуляр света - это, в сущности тоже отражения (солнца). Анимация спекуляра и отражений должна совпадать по крайней мера для удалённых объектов, ведь она отклоняется одними и теми же нормалями, а она совершенно не похожа, как будто в отражениях где-то допущена ошибка.
Да я уж говорил, cull face забыл поменять, поэтому отражались задние грани. Бывает  

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


: Визуализация водной поверхности. Быстрое преобразование Фурье на GPU
: Mikle 14 Apr 2010 - 15:02:11
Кубемапа применяется для отражений от предметов, размеры которых значительно меньше расстояния до отражаемых объектов, чем больше разница (точнее отношение), тем ближе к реалистичности. Для воды это никак не применишь, разве что для отражений скайбокса, который условно можно считать бесконечно удалённым.
[!--quoteo--][div class=\'quotetop\']Цитата[/div][div class=\'quotemain\'][!--quotec--]cull face забыл поменять, поэтому отражались задние грани[/quote]
Да не о там я. "cull face забыл поменять" - это значит, что мы увидем вывернутое наизнанку отражение замка. Пусть бы мы увижели хоть Ктулху (  ), отражение должно колебаться синхронно с спекуляр бликами.
Я, к сожалению, не силён в OpenGL, чтобы быстро найти где ошибка.


: Визуализация водной поверхности. Быстрое преобразование Фурье на GPU
: DikobrAz 14 Apr 2010 - 15:35:03
: Mikle
Да не о там я. "cull face забыл поменять" - это значит, что мы увидем вывернутое наизнанку отражение замка. Пусть бы мы увижели хоть Ктулху (  ), отражение должно колебаться синхронно с спекуляр бликами.
Я, к сожалению, не силён в OpenGL, чтобы быстро найти где ошибка.
С использованием текстуры отражений это просто невозможно сделать правильно. Для отражений используется фэйк, по нормали и текстуре отражений просто нельзя понять в какую точку попадет луч, тем более, что он может попасть за пределы текстуры. Максимум, используя ещё карту глубины для отражений, можно оттрассировать луч, но это дороговато и все равно фейк.

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

В третьих, отражение и освещение очень разные вещи в реальности. Если на следующих картинках на фоне лунной дорожки что-нибудь отражалось, это очень слабо коррелировало бы с ней.
(http://harmony.naturalworld.ru/images/photos/062.jpg)


: Визуализация водной поверхности. Быстрое преобразование Фурье на GPU
: Mikle 14 Apr 2010 - 17:53:23
[!--quoteo--][div class=\'quotetop\']Цитата[/div][div class=\'quotemain\'][!--quotec--]В третьих, отражение и освещение очень разные вещи в реальности. Если на следующих картинках на фоне лунной дорожки что-нибудь отражалось, это очень слабо коррелировало бы с ней[/quote]
Это одно и то же. Кореллирует:
[img]http://tuapse-mikle.narod.ru/scr3.jpg\" border=\"0\" alt=\"\" /]


: Визуализация водной поверхности. Быстрое преобразование Фурье на GPU
: DikobrAz 14 Apr 2010 - 22:04:33
: Mikle
Это одно и то же. Кореллирует:

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


: Визуализация водной поверхности. Быстрое преобразование Фурье на GPU
: Sergio 15 Apr 2010 - 13:21:44
Ну вообще по идее, если сделать кубическую карту в HDR тогда должно хватать и отражений. А рисовать её надо из точки пересечения вектора взгляда с плоскостью воды. Хотя, действительно, для близких объектов (замок) будет заметно, что отражения меняются с поворотом камеры и будет не тру. А для скайбокса самое оно. Самое главное здесь - HDR. Потому что на приведенных картинках яркость источника света во много раз превышает яркость окружения и из-за этого становится видна дорожка.


: Визуализация водной поверхности. Быстрое преобразование Фурье на GPU
: DikobrAz 15 Apr 2010 - 13:41:39
: Sergio
Ну вообще по идее, если сделать кубическую карту в HDR тогда должно хватать и отражений. А рисовать её надо из точки пересечения вектора взгляда с плоскостью воды. Хотя, действительно, для близких объектов (замок) будет заметно, что отражения меняются с поворотом камеры и будет не тру. А для скайбокса самое оно. Самое главное здесь - HDR. Потому что на приведенных картинках яркость источника света во много раз превышает яркость окружения и из-за этого становится видна дорожка.

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

А бывает и так:
. Это конечно ни о чем не говорит, потому что скайбокс был не ХДРный.


: Визуализация водной поверхности. Быстрое преобразование Фурье на GPU
: Mikle 15 Apr 2010 - 13:56:50
[!--quoteo--][div class=\'quotetop\']Цитата[/div][div class=\'quotemain\'][!--quotec--]она возникает из-за вторичных переотражений[/quote]
Очень сомневаюсь. Тут дело в другом. Солнце, и даже Луна, имеют яркость значительно выше, чем способен воспроизвести монитор. Поэтому на развёртках скайбокса они изображаются непропорционально тёмными, если бы они были натурально яркими, то и простое отражение скайбокса от поверхности давало бы реалистичный вид бликов, а спекуляр был бы не нужен. Спекуляр - это костыль.
А на последнем скрине, возможно, мы видим угловую часть, вырезанную из более крупной фотографии, и, соответственно, видим перспективные искажения широкоугольной камеры.


: Визуализация водной поверхности. Быстрое преобразование Фурье на GPU
: DikobrAz 15 Apr 2010 - 14:13:41
: Mikle
Очень сомневаюсь. Тут дело в другом. Солнце, и даже Луна, имеют яркость значительно выше, чем способен воспроизвести монитор. Поэтому на развёртках скайбокса они изображаются непропорционально тёмными, если бы они были натурально яркими, то и простое отражение скайбокса от поверхности давало бы реалистичный вид бликов, а спекуляр был бы не нужен. Спекуляр - это костыль.
А на последнем скрине, возможно, мы видим угловую часть, вырезанную из более крупной фотографии, и, соответственно, видим перспективные искажения широкоугольной камеры.
Про HDR уже писали тут. Я бы не стал утверждать, что грамотная модель освещения это костыль (у меня в демке не грамотная, я не претендую). Она может моделировать гораздо больше особенностей чем первичные отражения. Например, отражения не учитывают: многочисленные переотражения внутри поверхности, аберрации, особенности человеческого восприятия. Собственно цвет воды, цвет и даже вид отражений зависят от множества ньюансов вплоть до химического состава воды.

Искажения лунной дорожки довольно распространённое явление.
(http://farm3.static.flickr.com/2560/3776664479_2e481c25d2.jpg)http://dxdy.ru/topic26264.html[/a]


: Визуализация водной поверхности. Быстрое преобразование Фурье на GPU
: Sergio 15 Apr 2010 - 15:03:09
Классная тема.
Искажения действительно могут возникать только от того, что на поверхности воды есть волны с очень маленькой частотой (допустим одна большая волна на все озеро) - это типа как колебания воды в ванной
А дорожка собственно возникает от случайного (хаотического) расположения и размеров волн на поверхноси воды и чем дальше от наблюдателя - тем больше эти неравномерности смешиваются и получается "сплошная" дорожка

правка: причем дорожка возникает только принизком расположении источника света (то есть при большом угле между наблюдателем и источником)


: Визуализация водной поверхности. Быстрое преобразование Фурье на GPU
: Mikle 15 Apr 2010 - 15:04:45
DikobrAz
[!--quoteo--][div class=\'quotetop\']Цитата[/div][div class=\'quotemain\'][!--quotec--] Я бы не стал утверждать, что грамотная модель освещения это костыль[/quote]
Грамотный костыль, в той же мере, в какой костылём является самолёт - ведь человек не может летать сам. И твоя реализация выглядит как раз грамотно, в плане спекуляра её никто не критикует, мы обсуждаем физику света вообще.
А "переотражения внутри поверхности, аберрации, особенности человеческого восприятия, собственно цвет воды" - это всё верно, но все эти факты ТОЧНО ТАК ЖЕ, как на спекуляр блики, влияют и на все отражения вообще, речь об этом.


: Визуализация водной поверхности. Быстрое преобразование Фурье на GPU
: DikobrAz 15 Apr 2010 - 16:43:53
: Mikle
Грамотный костыль, в той же мере, в какой костылём является самолёт - ведь человек не может летать сам. И твоя реализация выглядит как раз грамотно, в плане спекуляра её никто не критикует, мы обсуждаем физику света вообще.
А "переотражения внутри поверхности, аберрации, особенности человеческого восприятия, собственно цвет воды" - это всё верно, но все эти факты ТОЧНО ТАК ЖЕ, как на спекуляр блики, влияют и на все отражения вообще, речь об этом.
Да я и не спорю. Более того, я согласен, что интенсивный путь развития компьютерной графики более дальновиден, что лучше моделировать отражения от объектов и отражения источников света одними методами. Просто на данный момент уровень развития железа и алгоритмической базы вряд ли позволит создать универсальный алгоритм, который качественно справится с подобными эффектами. Поэтому имеет смысл моделировать подобные вещи раздельно (отражения источников света и отражения объектов, хотя в данном контексте мне не нравится использовать термин "отражения"), чем собственно и занимаются, когда требуется быстрая скорость работы и приемлемая реалистичность.


: Визуализация водной поверхности. Быстрое преобразование Фурье на GPU
: Albert 14 May 2010 - 18:02:57
Обновлен бинарный и исходный код демо-программы к статье.

Новые ссылки:
GPU_water_demo2.zip (http://www.uraldev.ru/articles/files/35/GPU_water_demo2.zip)
GPU_water_demo_src2.zip (http://www.uraldev.ru/articles/files/35/GPU_water_demo_src2.zip)


: Визуализация водной поверхности. Быстрое преобразование Фурье на GPU
: DikobrAz 14 May 2010 - 22:53:40
: Albert
Обновлен бинарный и исходный код демо-программы к статье.

Новые ссылки:
GPU_water_demo2.zip (http://www.uraldev.ru/articles/files/35/GPU_water_demo2.zip)
GPU_water_demo_src2.zip (http://www.uraldev.ru/articles/files/35/GPU_water_demo_src2.zip)

Спасибо  


: Визуализация водной поверхности. Быстрое преобразование Фурье на GPU
: Sergio 15 May 2010 - 16:36:00
А что нового?
правка: в новом архиве не хватает DevIL.dll


: Визуализация водной поверхности. Быстрое преобразование Фурье на GPU
: Mikle 19 May 2010 - 00:14:16
Да, не хватает, пришлось копировать из первого архива.
В демках (обеих) глюк - если наклоняться вниз, то ограничения при взгляде вертикально вниз не происходит, можно перевернуться головой вниз. Если в таком состоянии немного подвигаться, а потом восстановить нормальное положение камеры, то она оказывается с наклоном набок.


: Визуализация водной поверхности. Быстрое преобразование Фурье на GPU
: DikobrAz 19 May 2010 - 16:19:52
: Sergio
А что нового?
правка: в новом архиве не хватает DevIL.dll

Да пофиксил просто отражения, чтобы не бэк грани выводились.