теория, алгоритмы, примеры на С++ и OpenGL  

Мы vkontakte.ru


Rambler's Top100 Rambler's Top100
Каталог@Mail.ru - каталог ресурсов интернет

Друзья

Словарь синонимов русского языка

Модели затенения. Плоская модель. Затенение по Гуро и Фонгу

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

Полигональные модели геометрии

В современных API по выводу графики реального времени, таких как OpenGL и DirectX, а также во многих пакетах трехмерной графики, для представления геометрии используются полигональные модели. На практике это означает, что вся сцена представляет собой набор треугольников, называемых гранями.

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

Идеальная модель Полигональное приближение
Идеальная модель
Полигональное приближение

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

Нормали изначально заданы в вершина Нормали восстановлены
Нормали изначально заданы в вершинах
Нормали восстановлены

Конечно, это пример крайности, но он ярко демонстрирует потерю деталей при восстановлении.

Прим. В некоторых случаях восстановление нормалей является необходимой частью построения полигональной модели, например, когда в качестве исходной информации есть только несвязный набор точек. Стоит отметить, что в DirectX и OpenGL нормали можно задавать только для вершин.

Треугольник с нормалями

Плоская модель затенения (flat shading)

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

Сфера с плоским затенением, около 2000 треугольников Сфера с плоским затенением, около 32000 треугольников
Сфера с плоским затенением, около 2000 треугольников
Сфера с плоским затенением, около 32000 треугольников

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

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

Затенение по Гуро (Gouraud shading)

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

Сфера с затенением по Гуро, около 2000 треугольников Сфера с затенением по Гуро, около 32000 треугольников
Сфера с затенением по Гуро, около 2000 треугольников
Сфера с затенением по Гуро, около 32000 треугольников

С другой стороны, вычислительная стоимость затенения по Гуро остается приемлемой, т.к. дорогостоящий расчёт освещения по-прежнему осуществляется в вершинах, а линейную интерполяцию можно хорошо оптимизировать. К сожалению, модель затенения по Гуро не безупречна. Блики на освещаемой поверхности при невысоком уровне детализации будут смазаны или могут вовсе "потеряться".

Смазанный блик в модели затенения Гуро Чёткий блик
Смазанный блик в модели затенения Гуро
Чёткий блик

Затенение по Фонгу (Phong shading)

В этой модели между вершинами интерполируется не цвет, а нормаль. Цвет, в свою очередь, рассчитывается для каждого пикселя в отдельности. При использовании затенения по Фонгу изображение получается гораздо более качественным, чем при использовании предыдущих техник, и исчезает проблема с бликами. Но данный алгоритм требует гораздо больше вычислительных ресурсов. К примеру, при использовании модели Фонга для визуализации сцены на экране с разрешением 1024x768, понадобится рассчитать освещение для более чем 700 000 точек.

Сфера с затенением по Фонгу, около 2000 треугольников Сфера с затенением по Фонгу, около 32000 треугольников
Сфера с затенением по Фонгу, около 2000 треугольников
Сфера с затенением по Фонгу, около 32000 треугольников

Шейдинг сегодня

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

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

Обычное текстурирование Текстурирование с наложением неровностей (bump mapping)
Обычное текстурирование
Текстурирование с наложением неровностей (bump mapping)