<< к оглавлению...

Ambient Occlusion

Ambient Occlusion/AO (дословно: внешнее преграждение, перекрытие окружающей среды) это процесс, который для любой отдельно взятой (освещённой) точки вычисляет, насколько эта точка "перекрывается" окружающими её объектами.
Рендер-системы, такие как Brazil, рассчитывают ambient occlusion как часть собственной системы skylight.
Skylight (небесный, он же верхний или потолочный свет) – свет исходящий из сферы, окружающей всю сцену (как естественный уличный свет в реальном мире). После того, как просчитано значение АО для заданной точки, свет множится на это значение, в результате чего и получается конечная насыщенность света в каком-либо определённом месте. В итоге, получаем равномерно освещённую сцену с мягкими тенями (или затемнениями) в трещинах и щелях и под самими объектами, примерно так, как выглядят тени в пасмурный день.
Обратите внимание, в этом примере плоскость "отсекает" любой свет, идущий из под сферы.

AO example

Для того, чтобы создать небесный свет во многих рендер-системах достаточно просто нажать кнопку skylight, но иногда не плохо иметь представление о том, как это всё происходит. И данный урок – лишь небольшое введение в тему "как расчитывается ambient occlusion, и как это зрительно отражается на картинке".

Итак, Skylight осветил всю сцену. Теперь, возьмём точку, которую желаем отрендерить. Назовём её точка А. Затем, "выстреливаем" определённое число лучей из точки А в полусферическом направлении вокруг нормалей плоскости (так как это плоскость имитирует землю/пол, её нормали направлены наверх), и смотрим насколько часто эти лучи перекрываются близлежащими объектами. В этом примере, мы "выстреливаем" 5 лучей (в реальности, при просчёте гораздо больше, чем 5; для простоты возьмём 5). Лучи 1, 2 и 3 не касаются никакого объекта на своём пути (наверх) к полусфере. Лучи 4 и 5 попадают на близлежащий объект (сферу), и таким образом, лучи имеют преграду. Итак, на этой картинке, мы выпустили всего 5 лучей, 2 луча получились с преграждением, так получаем соотношение лучей перекрытых и всех лучей в целом – 2 из 5 (запишем как 2/5).

Теперь, посмотрим на точку В на плоскости, которая ближе к сфере. Снова "выстреливаем" 5 лучей, лучи 1 и 2 – идут без каких-либо препятствий, оставшиеся попадают на сферу (и соответственно, имеют преграду). Для точки В получаем значение 3/5.

Теперь, представьте, что выполнение данных расчётов производится для каждой точки. Мы берём соотношение лучей, встречающих преграждение, к общему количеству лучей в сцене. Чем ближе это значение к 0, тем меньше преграждений, чем ближе к 1, тем больше (преграждений). В вышеприведённом примере, точка А будет ближе к чёрному (менее перекрыта), точка В будет ближе к белому (более перекрыта).

В нашем 3D пространстве, это даёт нам следующую картину...

Теперь умножим наш небесный свет на обратную величину картинки с AO, и получим изображение с (изученным явлением) Ambient Occlusion.

Теперь, когда вы будете создавать "уличную" сцену, для реалистичности очень рекомендую добавить немного небесного света (не забывая и про другие источники света, такие, как направленный светло-жёлтый свет для солнца).
Конечно, реальные математические расчёты, задействованные в данной технике, гораздо сложнее, и разнятся для каждой системы рендеринга, и данный урок даёт лишь основное начальное представление об ambient occlusion.
Также следует учесть, что системы рендеринга, имеющие skylight, но без ambient occlusion обычно не учитывают величину максимального расстояния в своих расчётах AO, эта величина определяет значение, учитывающее насколько делеко уйдут выпущенные лучи перед тем, как они будут считаться лучами, не имеющими на своём пути препятствий. Это бывает полезно для расчётов ambient occlusion внутри помещений. Но так как небесный свет (skylight) изначально предназначен для имитации неба, а не для более общей цели расчета "перекрытий" света и в большинстве случаев не имеет таких настроек. Создаётся некоторая путаница в том, для чего нужен небесный свет, а для чего – ambient occlusion. Как правило, небесный свет – это свет, в котором рассчитывается ambient occlusion без параметра максимального расстояния, а шейдер ambient occlusion просто создаёт "изображение с перекрытием" без света, и обычно имеет такие настройки как величина максимального расстояния. В идеале, конечно, следует использовать оба метода.


оригинал статьи : http://www.neilblevins.com/cg_education/ambient_occlusion/ambient_occlusion.htm
перевод и адаптация: Александр Ергашов /© 2009-2012/
<< к оглавлению...