Твоё освещение настолько дешёвое… Часть 1. Запекаем Ambient Occlusion нестандартным способом

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Почти все слышали про SSAO. Эта техника позволяет рассчитать примерное значение затенения от глобального рассеянного освещения на основе глубины и используется в реальном времени в шейдерах.

Демонстрация SSAO из примеров Three.js
Демонстрация SSAO из примеров Three.js

Но если вы делаете трёхмерное приложение для веб или широкого круга пользователей, если важно сохранить быстродействие приложения, тогда можно заранее рассчитать освещение/затенение в текстуру. С Ambient Occlusion это тоже работает.


Лайтмап (shadowmap) - текстура, каждая точка в которой имеет собственную трёхмерную координату на сцене. Натянув эту текстуру на сцену, мы получим значение освещённости или затенения на каждом полигоне трёхмерного пространства.

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

  2. Полигон плоский, поэтому заведём для каждого полигона Rect - в нём будет нарисовано освещение для этого конкретного полигона. Каждая точка полигона имеет координату в прямоугольнике. А т.к. полигон расположен в пространстве, то каждой точке в прямоугольнике мы можем сопоставить 3D координату.

  3. Используя алгоритмы Bin Packing, укладываем эти прямоугольники на большую текстуру как можно плотнее. Это ключевой момент, мы получили соответствие "3D точка в пространстве - 2D точка в лайтмапе".

Разметка отдельных Rect в текстуре лайтмапа
Разметка отдельных Rect в текстуре лайтмапа
Размеченная текстура на сцене
Размеченная текстура на сцене

В качестве бонуса. Бросаем луч из источника света в эту точку, проверяем пересечение этого луча с другими полигонами, получаем значение освещённости данной точки. Записываем это значение в лайтмап.

Использование лайтмапы низкого разрешения
Использование лайтмапы низкого разрешения

Построив лайтмап, рассчитав освещение от каждого источника света, мы можем придать сцене глубины, вычислив для каждой точки лайтмапы значение затенения от рассеянного света - Ambient Occlusion. В каноническом варианте используется метод Монте-Карло: нам необходимо бросить N лучей из точки и вычислить, сколько из них пересекаются с существующей геометрией.

Ray casting при вычислении AO, вид сбоку
Ray casting при вычислении AO, вид сбоку

Значение AO можно будет посчитать по формуле:

						</div>

Источник: https://habr.com/ru/articles/812571/<br/><br/>




<div style=

Интересные статьи

Интересные статьи

В марте рекламная платформа Telegram официально запустится в ста новых странах. Владельцы каналов смогут получать до 50% от показа рекламы. Об этом рассказал создатель мессенджера ...
 Назрела небольшая статья, скорее даже пост о распределенных взаимоблокировках в системах 1С. Мы периодически сталкиваемся с такими ситуациями у наших заказчиков и хочется поделиться с сообщество...
Это 2-ая часть статьи "Как задеплоить монолитный pet проект на Java с 0 и не сойти с ума". Первую часть вы можете найти по ссылке. В первой части мы успешно добавили свои наработки в репозиторий GitH...
Привет, Хабр! Представляем отчёт о первом этапе испытаний 6 российских стартерных аккумуляторных батарей (АКБ) из премиум-линеек в корпусе L2. Результаты тестов помогут определиться, какая модель ак...
Привет, Хабр! Продолжаем публиковать рецензии на научные статьи от членов сообщества Open Data Science из канала #article_essense. Хотите получать их раньше всех — вступайте в сообщество! Пер...