40. Построение теней при создании реалистических изображений. Учет теней в алгоритмах удаления невидимых поверхностей. - p1xelse/CG GitHub Wiki

Построение теней при создании реалистических изображений

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

про трассировку

Наиболее полного отображения тени можно добиться используя алгоритм трассировки лучей вместе с глобальной моделью отражения.

про Z буффер

Можно изменить алгоритм, использующий z-буфер, так, чтобы он включал построение теней. Модифицированный алгоритм состоит из двух шагов:

  1. строится сцена из точки наблюдения, совпадающей с источником. Значения z для этого вида хранятся в отдельном теневом z-буфере. Значения интенсивности не рассматриваются;
  2. затем сцена строится из точки, в которой находится наблюдатель. При обработке каждой поверхности или многоугольника его глубина в каждом пикселе сравнивается с глубиной в z-буфере наблюдателя. Если поверхность видима, то значения x, y, z из вида наблюдателя линейно преобразуются в значения x', y', z' на виде из источника. Для того чтобы проверить, видимо ли значение z' из положения источника, оно сравнивается со значением теневого z-буфера при x', y'. Если оно видимо, то оно отображается в буфер кадра в точке x, y без изменений. Если нет, то точка находится в тени и изображается согласно соответствующему правилу расчета интенсивности с учетом затенения, а значение в z-буфере наблюдателя заменяется на z'.

Для этого метода можно непосредственно использовать алгоритм построчного сканирования с z-буфером. В этом случае применяется буфер размером с одну сканирующую строку.

Учет теней в алгоритмах удаления невидимых поверхностей

Азертон включил построение теней в алгоритм удаления невидимых поверхностей, основанный на методе отсечения Вейлера-Азертона. Он состоит из двух шагов.

  1. На первом шаге с помощью алгоритма удаления невидимых поверхностей выбираются освещенные, т. е. видимые из положения источника грани. Для повышения эффективности в памяти хранятся именно они, а не невидимые грани. Т. к. это удвоило бы количество обрабатываемых граней для выпуклого многоугольника из-за того, что нелицевые грани обычно отбрасываются до применения алгоритма удаления невидимых поверхностей. Освещенные многоугольники помечаются и преобразуются к исходной ориентации, где они приписываются к своим прототипам в качестве многоугольников детализации поверхности.
    Чтобы не получить ложных теней сцену надо рассматривать в пределах видимого или отсекающего объема, определенного положением источника. Иначе область вне этого объема окажется затененной и наблюдатель увидит ложные тени. Это ограничение требует также, чтобы источник не находился в пределах сцены, т. к. в этом случае не существует перспективного или аксонометрического преобразования, которое бы охватывало всю сцену.
  2. На втором шаге объединенные данные о многоугольниках обрабатываются из положения наблюдателя. Если какая-то часть не освещена, применяется соответствующее правило затенения. Если источников несколько, то используется несколько наборов освещенных граней.

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

  1. Для каждого источника и многоугольника определить собственные тени и проекционные тени. Они записываются в виде двоичной матрицы – строки – многоугольники, отбрасывающие тень, столбцы – затеняемые многоугольники
  2. Обработка сцены относительно положения наблюдателя
  1. Определить видимые отрезки на интервале
  2. С помощью списка теневых многоугольников определить, падает ли тень на многоугольник, которые создаёт видимый отрезок на данном интервале
    a) нет теневых многоугольников – изобразить отрезок
    b) есть теневые многоугольники, но они не пересекают и не покрывают данный интервал – изобразить видимый отрезок
    c) интервал полностью покрывается хотя бы одним многоугольником – интенсивность изображаемого отрезка определяется с учётом интенсивностей этих многоугольников и самого отрезка
    d) хотя бы один теневой многоугольник частично покрывает интервал – рекурсивно разбивать интервал и работать с подыинтервалами
    Главная мысль от Курова с консультации: каждый алгоритм должен делать то, для чего он предназначен. Если совмещать две вещи (тени и удаление невидимых линий, поверхностей), то получается громоздкий и сложный алгоритм.
    На экзамене в этом вопросе даст простую конфигурацию объектов и источника и надо будет показать тени.

image

image