Компьютерная графика | ||||||||||||||||||||||||||||||||||
теория, алгоритмы, примеры на С++ и OpenGL | ||||||||||||||||||||||||||||||||||
2D теория | 3D теория | OpenGL | Обратная связь / Авторам | |||||||||||||||||||||||||||||||
Мы vkontakte.ru ДрузьяСловарь синонимов русского языка |
Модели затенения. Плоская модель. Затенение по Гуро и ФонгуВ этой статье речь пойдет о методах наложения освещения на объекты сцены в процессе создания двухмерного изображения (растеризации), иначе называемых алгоритмами затенения. Широко известны и активно применяются три модели затенения, которые будут рассмотрены ниже. Полигональные модели геометрииВ современных API по выводу графики реального времени, таких как OpenGL и DirectX, а также во многих пакетах трехмерной графики, для представления геометрии используются полигональные модели. На практике это означает, что вся сцена представляет собой набор треугольников, называемых гранями. В идеале поверхность модели, например тора, является гладким объектом. Но чтобы работать с такой поверхностью требуется создать полигональную модель, которая является приближением с некоторой точностью идеального объекта. При этом вершины граней полигонального приближения принадлежат реальной поверхности.
Для расчёта освещения необходимо задать нормали в тех точках, где оно будет вычисляться. Т.к. вершины полигонального приближения и вершины идеального объекта совпадают, то разумно задавать нормали в них. Другой способ - задание нормалей для граней. Такой способ приемлем, но он заведомо хуже, чем если бы нормали были заданы в вершинах. Действительно, вершина является точечным объектом, а грань имеет площадь. Т.о. для вершины можно задать нормаль точно, а для грани это некоторый усредненный вектор. К тому же, в моделях Гуро и Фонга нормаль должна быть задана в вершинах. Если исходно нормали были заданы для граней полигонов, то придется тем или иным образом восстанавливать их для вершин. Восстановленные значения будут чаще всего отличатся от реальных, так что некоторые детали будут потеряны. В качестве примера можно привести куб, нормали которого восстановлены усреднением по граням.
Конечно, это пример крайности, но он ярко демонстрирует потерю деталей при восстановлении. Прим. В некоторых случаях восстановление нормалей является необходимой частью построения полигональной модели, например, когда в качестве исходной информации есть только несвязный набор точек. Стоит отметить, что в DirectX и OpenGL нормали можно задавать только для вершин. Плоская модель затенения (flat shading)Идея алгоритма плоского затенения довольна простая. Сперва цвет вычисляется в каждой вершине треугольника, затем полученные значения усредняются и весь треугольник закрашивается в полученный цвет. Данная модель обладает высокой скоростью работы, но на визуализированной модели чётко заметны переходы между гранями.
Как видно на изображении, даже существенное увеличение количества треугольников не позволяет скрыть резкие переходы между ними. В настоящее время плоское затенение используется редко, в основном в программных визуализаторах или в тех случаях, когда необходимо подчеркнуть, что объект состоит из плоских граней. Прим. При использовании этой модели, не возникает трудностей, когда нормали заданы для граней, а не для вершин. В этом случае цвет треугольника можно рассчитывать в его геометрическом центре. Затенение по Гуро (Gouraud shading)В этой модели освещение не усредняется для грани, а линейно интерполируется между вершинами, поэтому для данной модели важно то, что нормали задаются в вершинах. Этот алгоритм позволяет получить гораздо более визуально-приятное изображение, чем при использовании алгоритма плоского затенения.
С другой стороны, вычислительная стоимость затенения по Гуро остается приемлемой, т.к. дорогостоящий расчёт освещения по-прежнему осуществляется в вершинах, а линейную интерполяцию можно хорошо оптимизировать. К сожалению, модель затенения по Гуро не безупречна. Блики на освещаемой поверхности при невысоком уровне детализации будут смазаны или могут вовсе "потеряться".
Затенение по Фонгу (Phong shading)В этой модели между вершинами интерполируется не цвет, а нормаль. Цвет, в свою очередь, рассчитывается для каждого пикселя в отдельности. При использовании затенения по Фонгу изображение получается гораздо более качественным, чем при использовании предыдущих техник, и исчезает проблема с бликами. Но данный алгоритм требует гораздо больше вычислительных ресурсов. К примеру, при использовании модели Фонга для визуализации сцены на экране с разрешением 1024x768, понадобится рассчитать освещение для более чем 700 000 точек.
Шейдинг сегодняДо появления программируемых графических ускорителей, использовалась либо модель затенения Гуро, либо, если речь шла о программных визуализаторах, быстрое затенение по Фонгу. Во всех современных играх используется модель Фонга (попиксельное освещение), которую позволяют рассчитывать в реальном времени даже недорогие видеокарты. Это достигается за счёт огромного параллелизма в обработке данных. Сегодня активно применяются такие техники, как наложение неровностей (bump mapping) или рельефное текстурирование (relief mapping), которые позволяют, не увеличивая реальный объём геометрии, а лишь за счет дополнительной информации в текстурах значительно повышать детализацию визуализируемых поверхностей. Подробнее об этом будет обязательно написано в отдельной статье.
|