четверг, 30 июля 2020 г.

Volume render, часть 3. Освещение

Разбираем различные способы освещения объемов.

Физика процесса

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


Частные случаи рендеринга объемов

Области с низкой плотностью
Туман, облака в верхних слоях атмосферы, пар из труб, пыль, дымка в атмосфере, дождь и тд. Из-за низкой плотности объема самозатенением и тенью от объема можно пренебречь, остается только освещение и тени снаружи и от объектов внутри объема. О способе рендеринга можно прочитать в презентации nVidia Fast, Flexible, Physically-Based Volumetric Light Scattering.


Туман без самозатенения

Рассеивание света в тумане

Объемный свет

Объемные тени

Ливень
Итоги:
  • Для объемов с низкой плотностью можно использовать более оптимизированную модель освещения с меньшим количеством шагов при интегрировании.
  • Требуется учитывать рассеивание освещения внтури объема.
  • Требуется учитывать освещение и тени снаружи объема.
  • Тени внутри объема затухают, так как смешиваются с рассеяным освещением.
  • Объекты внутри объемов могут не отбрасывать тени, если свет достаточно сильно рассеялся проходя сквозь объем.

Области с высокой плотностью
Это облака, плотный туман, дым, пыль. Чаще всего плотность не постоянная, по краям плотность меньше, внутри могут быть полости и тд. 

Облака

Плотный туман с самозатенением

Пыль и дым после взрыва

Тень от горы на облаках

Серебренное свечение

Молния

Итоги:
  • Переменная плотность требует больших шагов при интегрировании.
  • Требуется учитывать рассеивание освещения внтури объема.
  • Требуется учитывать освещение и тени снаружи объема.
  • Тени внутри объема не отбрассываются, но более плотные объекты влияют на рассеивание освещения (то есть нет таких четких теней как в тумане).
  • Требуется учитывать эффекты: серебренное свечение (silver lining), радуга в облаках (Fogbow, glory).

Области с высоким коэффициентом поглощения
Это дождевые облака, дым от горения нефтепродуктов и тд в этом случае свет быстро поглощается и сильно рассеивается. Отдельные случаи это когда при горении в дыму оказываются горящие частицы, тогда появляются светящиеся области, которые освещают дым поблизости и отбрасывают тени, модель освещения описана в Sparse Procedural Volume Rendering (видео).

Черный дым

Облака с низкой и высокой плотностью

Этот случай здесь не рассматривается

Итог:
  • Модель освещения близка к модели освещения непрозрачных объектов.
  • Требуется учитывать освещение и тени снаружи объема.
  • Требуется учитывать тени от объема.
  • Подповерхностное рассеивание для оптимизации можно не учитывать.
  • Внутри объема свет быстро поглощается, поэтому освещение и тени можно не учитывать.


Освещение при маршинге

С момента выхода Horizon: Zero dawn для рисования нижних слоев облаков используется маршинг. Для каждого шага маршинга внутри объема расчитывается освещение - берется несколько сэмплов по направлению к источнику освещения, это не так сильно замедляет рисование и дает достаточно реалистичный результат.
The Real-time Volumetric Cloudscapes of Horizon: Zero Dawn
Освещение считается для каждого шага внутри объема

6 сэмплов для расчета освещения точки внутри объема

Преимущества:
  • Легко реализовать.
  • Используя темпоральные техники можно заметно улучшить точность освещения.
Недостатки:
  • Само освещение в 2 раза снижает производительность, добавление нескольких источников освещения еще сильнее повлияет на производительность. Но для освещения облаков одного источника освещения обычно хватает.
  • Для проверки освещенности берется около 6 сэмплов в сторону источника освещения но с разными отклонениями. Точность рассчета зависит от расположения сэмплов и от формы объема, чаще всего четкие тени и яркие участки теряются и освещение получается размытым. Чем больше путь света внутри объема, тем больше нужно брать сэмплов для корректного освещения.
  • Рассеяное освещение получается за счет распределения сэмплов, что не совсем корректно.
  • Тени от других объектов сцены не учитываются.
  • Тени от облаков нужно считать отдельно таким же проходом маршинга, что не быстро. Можно отказаться от высокой детализации, но тогда тени будут заметно отличаться от самих облаков.


Более физически корректный способ разобран в статье Realistic rendering of clouds in realtime. Там используется несколько коллекторов, первый располагается как можно ближе к краю объема и его вклад в освещение объема наиболее значимый, за счет него видны яркие и темные части. Второй коллектор располагается дальше и используется для расчета рассеяного освещения.

Преимущества:
  • Физически корректный способ.
  • Производительность должна быть лучше, чем при маршинге.
Недостатки:
  • Нужно находить положение коллектора на краю объема, что немного снижает производительность.
  • Используются предрасчитанные распределения освещения для облаков с заданой плотностью, составом и тд, для других объемов нужно делать предрасчет заново. А предрасчет занимает недели на суперкомпьютере (но это было 10 лет назад).
  • Тени от других объектов сцены не учитываются.
  • Тени от облаков нужно рисовать отдельным проходом.


Освещение отдельным проходом

Для объема строится Sparse Voxel Octree (SVO), каждый воксель SVO является метавокслем - он хранит 32х32х32 вокселей. Для каждого вокселя метавокселя рассчитывается средняя плотность, далее для метавокселя рассчитывается освещение, результат сохраняется в 3D текстуру, освещение между метавокселями передается через отдельную 2D текстуру. При рендеринге объема освещение читается из 3D текстуры.
Расчет освещения для метавокселя
Преимущества:
  • Освещение отделено от рисования, что позволяет применить этот способ для многих способов рисования, в том числе и для маршинга.
  • Поддерживает множество источников освещения любых видов, но в ущерб производительности.
  • Корректное самозатенение и тени от объемов на других объектах сцены.
  • Поддерживаются тени от объектов снаружи и внутри объемов.
Недостатки:
  • На хранение освещения расходуется много памяти.
  • В демо присутствуют артефакты в тени от дыма, неизвестно можно ли от них избавиться.
  • Освещение получается размытым, так как 3D текстуры занимает много места и их разрешения будет недостаточно для более четких границ света и тени.
  • Изначально алгоритм сделан под один источник освещения, поэтому метавоксели ориентированы на этот источник, добавление нескольких источников требует доработки.


Предрасчет освещения

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

Преимущества:

  • Нет симуляций, что увеличивает производительность.

Недостатки:

  • SVO хоть и занимает меньше места, чем 3D текстуры, но потребление памяти достаточно большое.
  • Нет вариативности, как при реальной симуляции или процедурной генерации.
  • Не поддерживает динамическое освещение.
  • Для теней потребуется отдельный проход.



Комментариев нет:

Отправить комментарий