Иллюстрированный самоучитель по цифровой графике

Локальное и глобальное освещение

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

Глобальное освещение

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

  • поверхности могут блокировать часть падающего на них света и отбрасывать тени на другие поверхности;
  • в блестящих поверхностях могут присутствовать отражения других объектов;
  • на поверхностях могут возникать рефлексы;
  • прозрачные поверхности позволяют видеть объекты, находящиеся за ними.

Алгоритмы просчета глобального освещения при визуализации корректно учитывают прохождение света между поверхностями, что решает поставленные проблемы. Чаще всего используются два таких алгоритма:

  • трассирование лучей (ray tracing);
  • излучательность (radiosity).

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

  • Если поверхность не зеркальная и не прозрачная, за ней образуется тень. Цвет самой поверхности в точке пересечения вычисляется с учетом характеристик источников освещения.
  • Для зеркальных поверхностей делается оценка дальнейшего прохождения отраженного света (reflected light).
  • Для прозрачных – пропущенного света (transmitted light).

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

Алгоритм обратного трассирования лучей является очень мощным и гибким. Он позволяет аккуратно просчитывать такие характеристики глобального освещения, как тени, зеркальные отражения, преломления света в прозрачных материалах.

Однако он имеет два существенных недостатка:

  • высокая сложность и, как следствие, малая скорость вычислений;
  • подмена просчитанного непрямого освещения (indirect lighting) на "абстрактный" окружающий свет (ambient light), что приводит, например, к отсутствию рефлексов на поверхностях.

Алгоритм просчета излучательности фундаментально отличается от алгоритма трассирования лучей. Вместо вычисления цвета каждого пиксела итогового изображения этот алгоритм просчитывает интенсивность каждой точки пространства сцены. Поверхности всех объектов разбиваются на элементы (небольшие по площади) и для каждого из них вычисляется, сколько света он излучает на остальные элементы. Этот алгоритм, изобретенный в 1960-х годах, был значительно модернизирован в 1988 году и получил название алгоритма излучательности с последовательной детализацией (progressive refinement radiosity). Это новшество означает, что мы сможем наблюдать за улучшением качества и детализации изображения при прогрессивном разбиении поверхностей на более мелкие элементы.

Полученное таким образом изображение сцены является корректным с точки зрения отражений света между поверхностями (diffuse interreflections), но имеет и свои неустранимые недостатки:

  • большие затраты памяти при вычислениях;
  • отсутствие в полученном изображении отражений и преломлений света в прозрачных поверхностях.

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

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.