Оглавление Дополнительное чтение Учебник «Компьютерная графика» 
Прозрачность 
Фактура

Тени

Если положения наблюдателя и источника света совпадают, то теней не видно, но они появляются, когда наблюдатель перемещается в любую другую точку. Изображение с построенными тенями выглядит гораздо реалистичнее, и, кроме того, тени очень важны для моделирования. Например, особо интересующий нас участок может оказаться невидимым из-за того, что он попадает в тень. В прикладных областях — строительстве, разработке космических аппаратов и др. — тени влияют на расчет падающей солнечной энергии, обогрев и кондиционирование воздуха.

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

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

рис. 28.1

Если один объект препятствует попаданию света на другой, то получается проекционная тень, например тень на горизонтальной плоскости на рис. 28.1b. Чтобы найти такие тени, нужно построить проекции всех нелицевых граней на сцену. Центр проекции находится в источнике света. Точки пересечения проецируемой грани со всеми другими плоскостями образуют многоугольники, которые помечаются как теневые многоугольники и заносятся в структуру данных. Для того чтобы не вносить в нее слишком много многоугольников, можно проецировать контур каждого объекта, а не отдельные грани.

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

Пример. Рассмотрим параллелепипед на рис. 28.1a. Он задан точками P1(1, 0, 3.5), P2(2, 0, 3.5), P3(2, 0, 5), P4(1, 0, 5), P5(1, 3, 3.5), P6(2, 3, 3.5), P7(2, 3, 5), P8(1, 3, 5). Параллелепипед стоит на плоскости, заданной точками B1(0, 0, 0), B2(6, 0, 0), B3(6, 0, 6), B4(0, 0, 6). Источник света расположен в бесконечности на прямой, проходящей через P2 и P8. Точка наблюдения находится в бесконечности на положительной полуоси z после поворота сцены сначала на -45o вокруг оси y и затем на 35o вокруг оси x.

Для того чтобы найти собственные тени, необходимо определить нелицевые грани относительно положения источника. Составим матрицу объема параллелепипеда, где R, L, B, T, H, Y обозначают правую, левую, нижнюю, верхнюю, ближнюю и дальнюю грани, если смотреть на преобразованный объект из бесконечности с положительной полуоси z.

Вектор от источника к объекту в однородных координатах:
[E] = P2 - P8 = [1, -3, -1.5, 0].

Скалярное произведение вектора направления к источнику и нелицевых плоскостей дает:

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

Существует несколько способов нахождения проекционных теней. Один из них заключается в том, чтобы перенести и повернуть параллелепипед вместе с плоскостью его основания до совмещения вектора направления на источник с осью z. Источник находится в бесконечности, поэтому ортогональная проекция видимых граней на преобразованную плоскостьоснования дает проекционную грань. Значение z получается подстановкой x- и y-координат вершин преобразованного параллелепипеда в уравнение преобразованной плоскости основания. Затем координаты проекционных теней проводятся к первоначальной ориентации.

Для совмещения вектора падающего из бесконечности вдоль прямой P8P2 света с осью x необходимо:

  • перенести P2 в начало координат;
  • выполнить поворот на 33.69o вокруг оси y, чтобы P4 совпала с осью z;
  • выполнить поворот на 59.04o вокруг оси y, чтобы P8 совпала с осью z.

Объединенное преобразование:

Преобразуя плоскость основания и параллелепипед, получим

Уравнение npeoбразованной плоскости основания найдем методом Ньюэлла:
z = -0.6 y.

Подставляя x- и y-координаты вершин преобразованного параллелепипеда в уравнение плоскости, определим z, что дает проекцию тени на плоскость основания:

Штрих обозначает вершину проекционной тени.

Из положения источника видны только передняя, левая и верхняя грани; они и порождают проекционные тени:
передняя: P3P4P8P7 - P3'P4'P8'P7'
левая: P1P4P8P5 - P1'P4'P8'P5'
верхняя: P7P8P5P6 - P7'P8'P5'P6'

Отметим, что ни одна видимая грань не содержит точку P2; поэтому ее проекция P2' не входит в видимые проекционные тени. Обратным преобразованием, то есть [T]-1, построенные проекционные тени переводятся в исходную ориентацию:

Проекциями теней на плоскость основания будут S3S4S8S7, S1S4S8S5, S7S8S5S6, S4S8S7, S1S4S8S5, S7S8S5S6, а общим контуром — S1S5S6S7S3S4.

Ha рис. 28.1b показан результат после поворота на -45o вокруг оси y и затем на 35o вокруг оси x. Точка наблюдения находится в бесконечности на положительной полуоси z. Правая грань видима, но находится в собственной тени, поэтому она выглядит почти черной. Проекционная тень тоже выглядит почти черной, причем при наблюдении из заданной точки часть ее оказывается невидимой.

Идея совмещения процессов построения теней и удаления невидимых поверхностей была впервые предложена Аппелем. Им был разработан как метод трассировки лучей, так и метод построчного сканирования, усовершенствованный впоследствии Букнайтом и Кели. Включение теней в интервальный алгоритм построчного сканирования, например в алгоритм Уоткинса, осуществляется в два этапа.

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

Если сцена состоит из n многоугольников, то возможно n(n - 1) проекционных теней, поэтому важно найти эффективный способ получения матрицы. Букнайт и Кели проецируют сцену на сферу с центром в источнике света и применяют к спроецированным многоугольникам габаритные тесты с прямоугольной оболочкой для исключения большинства случаев. Затем количество вариантов можно сильно сократить путем использования простых трехмерных габаритных тестов. Для еще большего сокращения числа вариантов можно применить более сложные методы сортировки, например приоритетную сортировку Ньюэла-Ньюэла-Санча. Рассмотрим для иллюстрации несложный пример.

Пример. Матрица теней. Для простой сцены на рис. 28.1 матрицу теней можно составить на основе непосредственного наблюдения. Результат приведен в таблице.



Правый Левый Нижний Верхний Ближний Дальний Плоскость основания
Многоугольники, отбрасывающие тень Правый 1 0 0 0 0 0 1
Левый 0 0 1 0 0 1 1
Нижний 0 0 1 0 0 0 1
Верхний 1 0 0 0 0 0 1
Ближний 1 0 1 0 0 0 1
Дальний 0 0 0 0 0 1 1
Плоскость основания 0 0 0 0 0 0 0

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

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

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

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

Для того чтобы смоделировать такой эффект, можно установить пропорциональную зависимость интенсивности тени и источника. Если накладывается несколько теней, то их интенсивности складываются. Более сложных расчетов требует правило, позволяющее сделать интенсивность тени пропорциональной как интенсивности источника, так и расстоянию между поверхностью, на которую падает тень, и поверхностью, отбрасывающей тень.

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

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

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

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

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

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

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

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

Если источников несколько, то к базе данных добавляется несколько наборов освещенных граней.

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

На втором этапе вектор (луч) трассируется от видимой точки до источника света. Если между ними в сцене есть какой-нибудь объект, то свет от источника не попадает в данную точку, то есть она оказывается в тени (рис. 28.2).

рис. 28.2

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

Это показано на рис. 28.3 для прямого края четырехугольника и сферического источника. Средняя линия полутени рассчитывается в предположении, что точечный источник находится в центре сферы. С помощью подобных треугольников найдем проекцию половины ширины полутени r на направление L(рис. 28.3):
r(nL)/d = R/D
где d — расстояние от точки, отбрасывающей тень, до соответствующей точки на средней линии полутени; D — расстояние от точки, отбрасывающей тень, до центра сферического источника; R — радиус сферического источника.

рис. 28.3

Если смотреть от многоугольника, отбрасывающего тень, то телесный угол источника dw есть
dw = p(R/D)2,
поэтому половина ширины полутени равна r = d/(n'L') * R/D = d/(n'L') * (dw/p)1/2.

Это означает, что если телесный угол источника меньше, то он создает более резкую тень (то есть с меньшим r). У точечного источника dw = 0 и r = 0, поэтому полутени нет вообще. При сближении затеняемой и затеняющей поверхности d и r уменьшаются, и тень становится резче.

Интенсивность точек полутени определяется видимой частью источника. Для сферического источника, частично видимого от -R до a, эта доля составляет:
Afrac = 1/(pR2) * integral(2 * sqrt(R2 - x2), -R, a)dx = 1/2 + 1/p * [ a/R * sqrt(1 - (a/R)2) + sin-1(a/R) ].

Результаты показывают, что на одном краю полутень получается более четкой. Кук рекомендует хранить эти данные в таблице цветов. Однако проще рассчитывать линейную аппроксимацию
Afrac = 0.5(1 + a/R),
которая дает погрешность меньше 7%.

Прозрачность Фактура