- •«Национальный исследовательский томский политехнический университет»
- •Введение
- •Способы представления изображений в эвм
- •Растровое представление изображений
- •Параметры растровых изображений
- •Векторное представление изображений
- •Представление изображений с помощью фракталов
- •Геометрические фракталы
- •Алгебраические фракталы
- •Системы итерируемых функций
- •Представление цвета в компьютере
- •Свет и цвет
- •Цветовые модели и пространства
- •Цветовая модель rgb
- •Субтрактивные цветовые модели
- •Модели hsv и hsl
- •Системы управления цветом
- •Графические файловые форматы
- •Растровые алгоритмы
- •Алгоритмы растеризации
- •Растровое представление отрезка. Алгоритм Брезенхейма
- •Растровая развёртка окружности
- •Кривые Безье
- •Закраска области, заданной цветом границы
- •Заполнение многоугольника
- •Методы устранения ступенчатости
- •Метод увеличения частоты выборки
- •Метод, основанный на использовании полутонов
- •Методы обработки изображений
- •Яркость и контраст
- •Масштабирование изображения
- •Преобразование поворота
- •Цифровые фильтры изображений
- •Линейные фильтры
- •Сглаживающие фильтры
- •Контрастоповышающие фильтры
- •Разностные фильтры
- •Нелинейные фильтры
- •Преобразования растровых изображений
- •Векторизация с помощью волнового алгоритма
- •Построение скелета изображения
- •Оптимизация скелета изображения
- •Сегментация изображений
- •Методы, основанные на кластеризации
- •Алгоритм разрастания регионов
- •Компьютерная геометрия
- •Двумерные преобразования
- •Однородные координаты
- •Двумерное вращение вокруг произвольной оси
- •Трехмерные преобразования
- •2. Трехмерное изменение масштаба
- •3. Трехмерный сдвиг
- •4. Трехмерное вращение
- •Проекции
- •Математическое описание плоских геометрических проекций
- •Изображение трехмерных объектов
- •Видимый объем
- •Преобразование видимого объема
- •Представление пространственных форм
- •Полигональные сетки
- •Явное задание многоугольников
- •Задание многоугольников с помощью указателей в список вершин
- •Явное задание ребер
- •Удаление невидимых линий и поверхностей
- •Классификация методов удаления невидимых линий и поверхностей
- •Алгоритм плавающего горизонта
- •Алгоритм Робертса
- •Определение нелицевых граней
- •Удаление невидимых ребер
- •Алгоритм, использующий z–буфер
- •Методы трассировки лучей
- •Алгоритмы, использующие список приоритетов
- •Алгоритм Ньюэла-Ньюэла-Санча для случая многоугольников
- •Алгоритм Варнока (Warnock)
- •Алгоритм Вейлера-Азертона (Weiler-Atherton)
- •Методы закраски
- •Диффузное отражение и рассеянный свет
- •Зеркальное отражение
- •Однотонная закраска полигональной сетки
- •Метод Гуро
- •Метод Фонга
- •Поверхности, пропускающие свет
- •Детализация поверхностей
- •Детализация цветом
- •Детализация фактурой
- •Библиотека OpenGl
- •Особенности использования OpenGl в Windows
- •Основные типы данных
- •Рисование геометрических объектов
- •Работа с буферами и задание цвета объектов
- •Задание графических примитивов
- •Рисование точек, линий и многоугольников
- •Преобразование объектов в пространстве
- •Преобразования в пространстве
- •Получение проекций
- •Задание моделей закрашивания
- •Освещение
- •Полупрозрачность. Использование α-канала
- •Наложение текстуры
- •Аппаратные средства машинной графики
- •Устройства ввода
- •Сканеры
- •Основные характеристики
- •Фирмы-производители
- •Дигитайзеры
- •Принцип действия
- •Основные характеристики
- •Фирмы-производители
- •Цифровые фотокамеры
- •Принцип действия
- •Фирмы-производители
- •Литература
- •Оглавление
- •Отпечатано в Издательстве тпу в полном соответствии с качеством предоставленного оригинал-макета
-
Удаление невидимых ребер
После первого этапа удаления нелицевых отрезков необходимо выяснить, существуют ли такие отрезки, которые экранируются другими телами в картинке или в сцене. Для этого каждый оставшийся отрезок или ребро нужно сравнить с другими телами сцены или картинки.
Возможны следующие случаи:
-
Грань ребра не закрывает. Ребро остается в списке ребер.
-
Грань полностью закрывает ребро. Ребро удаляется из списка рассматриваемых ребер.
-
Грань частично закрывает ребро. В этом случае ребро разбивается на несколько частей, видимыми из которых являются не более двух. Само ребро удаляется из списка рассматриваемых ребер, но в список проверяемых ребер добавляются те его части, которые данной гранью не закрываются.
Для оптимизации используется приоритетная сортировка (z-сортировка), а также, сравнения с прямоугольными объемлющими оболочками тел. Такой подход позволяет удалить целые группы или кластеры отрезков и тел. Например, если все тела в сцене упорядочены в некотором приоритетном списке, использующем значения z ближайших вершин для представления расстояния до наблюдателя, то никакое тело из этого списка, у которого ближайшая вершина находится дальше от наблюдателя, чем самая удаленная из концевых точек ребра, не может закрывать это ребро. Более того, ни одно из оставшихся тел, прямоугольная оболочка которого расположена полностью справа, слева, над или под ребром, не может экранировать это ребро. Использование этих приемов значительно сокращает число тел, с которыми нужно сравнивать каждый отрезок или ребро. Рис. 8 .89 иллюстрирует работу алгоритма.
Рис. 8.89. Результат работы алгоритма Робертса
-
Алгоритм, использующий z–буфер
Алгоритм, использующий z-буфер это один из простейших алгоритмов удаления невидимых поверхностей. Впервые он был предложен Кэтмулом. Работает этот алгоритм в пространстве изображения. Идея z-буфера является простым обобщением идеи о буфере кадра. Буфер кадра используется для запоминания атрибутов (интенсивности) каждого пикселя в пространстве изображения, z-буфер - это отдельный буфер глубины, используемый для запоминания координаты z или глубины каждого видимого пикселя в пространстве изображения. В процессе работы глубина или значение z каждого нового пикселя, который нужно занести в буфер кадра, сравнивается с глубиной того пикселя, который уже занесен в z-буфер. Если это сравнение показывает, что новый пиксель расположен впереди пикселя, находящегося в буфере кадра, то новый пиксель заносится в этот буфер и, кроме того, производится корректировка z-буфера новым значением z. Если же сравнение дает противоположный результат, то никаких действий не производится. По сути, алгоритм является поиском по х и у наибольшего значения функции z (х, у).
Главное преимущество алгоритма – его простота. Кроме того, этот алгоритм решает задачу об удалении невидимых поверхностей и делает тривиальной визуализацию пересечений сложных поверхностей. Сцены могут быть любой сложности. Поскольку габариты пространства изображения фиксированы, оценка вычислительной трудоемкости алгоритма не более чем линейна. Поскольку элементы сцены или картинки можно заносить в буфер кадра или в z-буфер в произвольном порядке, их не нужно предварительно сортировать по приоритету глубины. Поэтому экономится вычислительное время, затрачиваемое на сортировку по глубине.
Основной недостаток алгоритма - большой объем требуемой памяти. Если сцена подвергается видовому преобразованию и отсекается до фиксированного диапазона значений координат z, то можно использовать z-буфер с фиксированной точностью. Информацию о глубине нужно обрабатывать с большей точностью, чем координатную информацию на плоскости (х, y); обычно бывает достаточно 20-ти бит. Буфер кадра размером 51251224 бит в комбинации с z-буфером размером 51251220 бит требует почти 1.5 мегабайт памяти. Однако снижение цен на память делает экономически оправданным создание специализированных запоминающих устройств для z-буфера и связанной с ним аппаратуры.
Альтернативой созданию специальной памяти для z-буфера является использование для этой цели оперативной памяти. Уменьшение требуемой памяти достигается разбиением пространства изображения на 4, 16 или больше квадратов или полос. В предельном варианте можно использовать z-буфер размером в одну строку развертки. Для последнего случая имеется интересный алгоритм построчного сканирования. Поскольку каждый элемент сцены обрабатывается много раз, то сегментирование z-буфера, вообще говоря, приводит к увеличению времени, необходимого для обработки сцены. Однако сортировка на плоскости, позволяющая не обрабатывать все многоугольники в каждом из квадратов или полос, может значительно сократить этот рост.
Другой недостаток алгоритма z-буфера состоит в трудоемкости и высокой стоимости устранения лестничного эффекта, а также реализации эффектов прозрачности и просвечивания. Поскольку алгоритм заносит пиксели в буфер кадра в произвольном порядке, то нелегко получить информацию, необходимую для методов устранения лестничного эффекта, основывающихся на предварительной фильтрации. При реализации эффектов прозрачности и просвечивания пиксели могут заноситься в буфер кадра в некорректном порядке, что ведет к локальным ошибкам.
Формальное описание алгоритма z-буфера таково:
-
Заполнить буфер кадра фоновым значением интенсивности или цвета.
-
Заполнить z-буфер минимальным значением z.
-
Преобразовать каждый многоугольник в растровую форму в произвольном порядке.
-
Для каждого Пиксель(x,y) в многоугольнике вычислить его глубину z(x,y).
-
Сравнить глубину z(х,у) со значением Zбуфер(х,у), хранящимся в z-буфере в этой же позиции.
Если z(х,у) > Zбуфер (х,у), то записать атрибут этого многоугольника (интенсивность, цвет и т. п.) в буфер кадра и заменить Zбуфер(х,у) на z(х,у). В противном случае никаких действий не производить.
На псевдокоде алгоритм можно представить так:
for all objects
for all covered pixels
compare z
В качестве предварительного шага там, где это целесообразно, применяется удаление нелицевых граней.
Если известно уравнение плоскости, несущей каждый многоугольник, то вычисление глубины каждого пикселя на сканирующей строке можно проделать пошаговым способом. Грань при этом рисуется последовательно (строка за строкой). Для нахождения необходимых значений используется линейная интерполяция (Рис. 8 .90).
Рис. 8.90. Сканирующая строка по грани
Для рисунка y меняется от y1 до y2 и далее до y3, при этом для каждой строки определяется xa, za, xb, zb:
xa = x1 + (x2 - x1);
xb = x1 + (x3 - x1);
za = z1 + (z2 - z1);
zb = z1 + (z3 - z1) .
На сканирующей строке x меняется от xa до xb и для каждой точки строки определяется глубина z:
z = za + (zb - za)
Реализация алгоритма вдоль сканирующей строки позволяет совместить алгоритм z-буфера с алгоритмами растровой развертки ребер и алгоритмами закраски грани.
Проиллюстрируем работу алгоритма на примере для Рис. 8 .91.
Рис. 8.91. Протыкающий треугольник
В начале в буфере кадра и в z-буфере содержатся нули. После растровой развертки прямоугольника содержимое буфера кадра будет иметь вид
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
Содержимое z-буфера таково:
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
0 |
0 |
0 |
0 |
0 |
0 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
0 |
0 |
0 |
0 |
0 |
0 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
0 |
0 |
0 |
0 |
0 |
0 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
0 |
0 |
0 |
0 |
0 |
0 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
0 |
0 |
0 |
0 |
0 |
0 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
0 |
0 |
0 |
0 |
0 |
0 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
0 |
0 |
0 |
0 |
0 |
0 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
0 |
0 |
0 |
0 |
0 |
0 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
0 |
0 |
0 |
0 |
0 |
0 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
0 |
0 |
0 |
0 |
0 |
0 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
0 |
0 |
0 |
0 |
0 |
0 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
0 |
0 |
0 |
0 |
0 |
0 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
При обработке треугольника преобразование его в растровую форму и сравнение по глубине дает новое значение буфера кадра:
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
2 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
2 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
2 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
2 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
2 |
1 |
1 |
1 |
1 |
2 |
2 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
2 |
2 |
1 |
1 |
1 |
1 |
2 |
2 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
2 |
2 |
2 |
2 |
1 |
1 |
1 |
2 |
2 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
2 |
2 |
2 |
2 |
2 |
1 |
1 |
1 |
2 |
2 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
2 |
2 |
2 |
2 |
2 |
2 |
1 |
1 |
1 |
2 |
2 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
2 |
2 |
2 |
2 |
2 |
2 |
1 |
1 |
2 |
2 |
2 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
2 |
2 |
2 |
1 |
1 |
2 |
2 |
2 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
2 |
2 |
2 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
2 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
Новое содержимое z-буфера таково:
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
5 |
0 |
0 |
0 |
0 |
0 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
5 |
0 |
0 |
0 |
0 |
0 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
6 |
0 |
0 |
0 |
0 |
0 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
6 |
0 |
0 |
0 |
0 |
0 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
11 |
10 |
10 |
10 |
10 |
6 |
5 |
0 |
0 |
0 |
0 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
12 |
11 |
10 |
10 |
10 |
10 |
7 |
5 |
0 |
0 |
0 |
0 |
10 |
10 |
10 |
10 |
10 |
10 |
13 |
12 |
11 |
11 |
10 |
10 |
10 |
7 |
6 |
0 |
0 |
0 |
0 |
10 |
10 |
10 |
10 |
10 |
14 |
13 |
12 |
12 |
11 |
10 |
10 |
10 |
7 |
6 |
0 |
0 |
0 |
0 |
10 |
10 |
10 |
10 |
15 |
14 |
13 |
12 |
12 |
11 |
10 |
10 |
10 |
7 |
6 |
0 |
0 |
0 |
0 |
10 |
10 |
10 |
10 |
10 |
14 |
13 |
12 |
12 |
11 |
11 |
10 |
10 |
8 |
7 |
5 |
0 |
0 |
0 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
12 |
11 |
11 |
10 |
10 |
8 |
7 |
5 |
0 |
0 |
0 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
8 |
7 |
6 |
0 |
0 |
0 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
0 |
0 |
6 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |