Joe's CGСтатьи

Методы построения оптимальных клиньев в алгоритме Penumbra Wedges

Автор:

Данный материал был готов более двух месяцев назад как статья для сайта www.gamedev.ru, но т. к. wat в виду большой занятости отложил его опубликование на неопределённо долгий срок, было принято решение разместить его здесь.

Введение

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

Между тем чёткие, резкие тени не являются распространёнными в реальном мире. Наоборот, преобладают тени с разной степенью размытости границ. Основное влияние на резкость тени оказывают три фактора: величина объёма, занимаемого источником света в пространстве; расстояние от предмета, отбрасывающего тень (кастера) до источника света; расстояние от кастера до предмета, принимающего тень (ресивера). Точечный источник света может производить только чёткие тени, с резкой границей перехода от области полного затенения к области света. В случае протяженного источника света, согласно оптическим законам, получается не одна тень, а целая серия теней, которые накладываются друг на друга и образуют нечёткую, размытую тень. Примером точечного источника света может служить маленькая лампа накаливания. Солнце только условно можно считать точечным источником света, т. к. оно занимает на небе определённую площадь. Примером ярко выраженного неточечного источника света является протяжённая флуоресцентная лампа освещения, какую можно часто увидеть в магазинах.

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

Алгоритм Penumbra Wedges

Для начала введём немного терминологии. Область тени, в которой вклад источника света в освещённость полностью отсутствует, называется умброй (umbra). Область тени, в которой вклад источника света в освещённость является неполным, называется пенумброй (penumbra). Величина области пенумбры характеризует нечёткость границы тени.

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

Figure01 | Методы построения оптимальных клиньев в алгоритме Penumbra Wedges

Рис. 1. a) Область умбры, образованная точечным источником света. b) Область пенумбры, образованная источником света, имеющего площадь.

Не вдаваясь в подробности волновой оптики, примем, что величина освещенности в заданной точке пенумбры является произведением освещённости в этой точке от полного источника света на величину его видимой площади в этой точке:

Ет = d * Е,

где
    Е – освещенность от полного источника света в заданной точке,
    d – процент видимой площади источника света в этой точке.

Несмотря на простоту формулы, вычисление процента видимости является нетривиальной задачей. Если каким-либо образом научиться это делать для каждой точки пенумбры, то на экране компьютера можно строить близкие к физически корректным тени. Это принцип и был применён в одном из методов построения мягких теней с использованием нового, специального геометрического примитива, называемого пенумбральным клином (penumbra wedge). Данный примитив предназначен для выделения в пространстве трёхмерной сцены той её части, в которой располагается область пенумбры и для которой необходимо выполнить расчёт освещенности.

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

Рассмотрим, эффективен ли алгоритм. Известно, что современные графические ускорители построены как потоковые устройства и могут оперировать только локальными данными о сцене, более общие данные недоступны. Penumbra Wedges оперирует тремя основными элементами:

1) Источник света (сферический или прямоугольный);
2) Cилуэтное ребро;
3) Образованная ими область пенумбры.

Figure02 | Методы построения оптимальных клиньев в алгоритме Penumbra Wedges

Рис. 2. Прямоугольный источник света, произвольно ориентированный относительно силуэтного ребра (выделено красным). Ниже изображена образованная ими область пенумбры.

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

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

Общие принципы построения клиньев

Рассмотрим произвольное ребро, заданное вершинами е0, е1 и источник света произвольной формы с центром в точке с. Построим два конуса от этого источника таким образом, чтобы их фокусы находились в вершинах ребра (рис. 3a). Тогда точный пенумбральный объём, генерируемый силуэтным ребром, получается путём протяжения от одного конуса до другого.

Figure03 | Методы построения оптимальных клиньев в алгоритме Penumbra Wedges

Рис. 3. a) Пенумбральный объём, создаваемый ребром. b) Пенумбральный объём, вырожденный в один конус.

Расчёт точного объёма для источника света произвольной формы немыслимо проводить в реальном времени. Однако, точный объём и не требуется - достаточно, чтобы построенный объём просто полностью охватывал требуемую часть сцены. В то же время, важно чтобы такой упрощённый объём как можно более плотно охватывал реальный пенумбральный объём. Проблема заключается в том, что расчёт освещённости в пенумбре занимает основное время алгоритма и крайне (!) важно уменьшить это время. Поэтому, чем ближе будет построенный объём к оптимальному, тем меньше связанных с освещённостью вычислений будет производить GPU и соответственно увеличится производительность алгоритма.

Как отмечают авторы, пенумбральный объём может вырождаться в один конус, который полностью охватывает другой конус (рис. 3b). Это происходит в тех случаях, когда ребро расположено перпендикулярно к источнику света. Новый примитив - пенумбральный клин, который охватывает область пенумбры, конструируется из набора треугольников и должен быть выпуклым (convex) примитивом. Ситуация с вырожденным объёмом порождает вогнутый (concave) клин, что приведёт к ошибкам отображения, поэтому такие ситуации должны устраняться.

Figure04 | Методы построения оптимальных клиньев в алгоритме Penumbra Wedges

Рис. 4. Смещение одной из вершин силуэтного ребра для получения «устойчивого» клина.

Страницы: 1 2 3 4 5 6 Следующая »

28 мая 2007 (Обновление: 9 янв 2008)