
- •Глава 9. Описание и характеристика поверхностей 3
- •Глава 14. Трассировка лучей 82
- •Глава 15. Цвет в компьютерной графике 90
- •Глава 16. Сжатие графических изображений 96
- •Глава 9. Описание и характеристика поверхностей
- •9.1. Описание поверхностей
- •Параметрическое описание
- •Описание неявными функциями
- •Поточечное описание
- •Фрактальное описание
- •9.2. Характеристики поверхностей
- •Поверхности 1-го порядка
- •Поверхности 2-го порядка
- •Фрактальные поверхности
- •9.3. Моделирование деформации трехмерных полигональных поверхностей в режиме реального времени
- •Метод деформации на основе использования неявного задания поверхности объекта
- •Метод деформации плоских протяженных объектов
- •Метод деформации тела, заданного полигональной сеткой
- •9.4. Триангуляция поверхностей
- •Уровень детализации (lod)
- •Глава 10. Получение реалистичных изображений
- •10.1. Методы создания реалистических изображений
- •Перспективные проекции
- •Передача глубины яркостью
- •10.2. Перспективные изображения
- •Глава 11. Проецирование
- •11.1. Основные виды проекций
- •Параллельные проекции
- •Центральные проекции
- •11.2. Математическое описание прямоугольных проекций
- •11.3. Математическое описание косоугольных проекций
- •11.4. Математическое описание перспективной проекции
- •11.5. Задание произвольных проекций. Видовое преобразование.
- •Глава 12. Алгоритмы удаления скрытых линий и поверхностей
- •12.1. Общие сведения об удалении скрытых линий и поверхностей
- •12.2. Алгоритм сортировки по глубине (оп)
- •12.3. Алгоритм, использующий z-буфер (пи)
- •12.4. Алгоритм построчного сканирования (пи)
- •12.5. Алгоритм разбиения области
- •12.6. Алгоритм плавающего горизонта
- •12.8. Алгоритм трассировки лучей
- •12.9. Иерархический z—буфер (смешанный тип)
- •Глава 13. Свет в компьютерной графике
- •13.1. Общие сведения о свете.
- •13.2. Модель освещения.
- •Свойства объектов
- •Отражение диффузное
- •Зеркальное отражение
- •Пропускание света (прозрачность)
- •13.3. Закраска полигональных сеток
- •Однотонная закраска
- •Интерполяция интенсивностей (метод Гуро)
- •Интерполяция векторов нормали (метод Фонга)
- •13.4. Тени
- •Источник света в бесконечности
- •Локальный источник
- •13.5. Фактура. Нанесение узора.
- •Нанесение узора на поверхность. Регулярная текстура.
- •Нанесение узора на поверхность. Стохастическая текстура.
- •13.6. Создание неровностей на поверхности.
- •Использование карт высот
- •Метод возмущения нормали
- •Использование фрактальных поверхностей
- •13.7. Фильтрация текстур
- •13.8. Полутоновые изображения
- •Глава 14. Трассировка лучей
- •14.1 Метод прямой трассировки
- •14.2 Метод обратной трассировки
- •Глава 15. Цвет в компьютерной графике
- •15.1. Ахроматический и хроматический цвета
- •15.2. Цветовые модели
- •Системы смешивания основных цветов
- •Цветовая модель hsv
- •Модель hls
- •Цилиндрическая цветовая модель
- •Глава 16. Сжатие графических изображений
- •16.1. Графические форматы
- •16.2. Основные сведения о сжатии изображений
- •16.3. Алгоритмы сжатия файлов без потерь
- •Алгоритм Хаффмана
- •Алгоритм Лемпеля—Зива (lzw)
- •Алгоритм rle (Run Length Encoding)
- •Обрезание хвостов
- •16.4. Сжатие с потерями цветных и полутоновых файлов
- •Сжатие изображения по стандарту jpeg
- •Новый стандарт jpeg 2000
- •Фрактальное сжатие изображений
12.9. Иерархический z—буфер (смешанный тип)
Представим себе виртуальную прогулку по городу с его растительностью, зданиями, мебелью внутри зданий со всеми ее ящиками, ножками, ручками и т.д. Традиционные алгоритмы определения текущей видимости объектов, реализуемые на существующем аппаратном обеспечении, вряд ли справятся с задачей визуализации сцен подобной сложности на скоростях, соответствующих интерактивной графике. Поэтому нужны быстрые алгоритмы, способные значительно ускорить просчет видимых частей и отброс всей невидимой части сцены.
Существует три типа когерентных связей, присущих процессам просчета видимости объектов.
Когерентность в объектном пространстве: во многих случаях однократное вычисление позволит определить видимость целого набора рядом расположенных объектов.
Когерентность в пространстве изображения: очень часто однократное вычисление позволяет определить видимость объекта, покрывающего определенный набор пикселей на экране.
Переходная когерентность — информация о видимости объектов в одном кадре, зачастую может быть использована для ускорения просчетов в следующем кадре.
Иерархический Z-буфер реализуюет все три типа когерентных связей и позволяет на несколько порядков опередить традиционные технологии.
В основе лежат два алгоритма – Z-буфер (Z-buffer) и трассировка лучей (ray tracing). Традиционный Z-буфер достаточно эффективно использует когерентные связи в пространстве изображения. Но проблема традиционного Z-буфера состоит в том, что он совершенно не использует когерентные связи в объектном пространстве и переходную когерентность между кадрами. Каждый полигон просчитывается отдельно, и нам недоступна информация об уже произведенных расчетах в предыдущем кадре. Для сцен с высокой геометрической сложностью, как, например, модель города, данный подход очень неэффективен. Традиционный алгоритм будет, например, тратить время на просчет каждого полигона у каждого объекта, каждого ящика у каждого письменного стола в здании, даже если все здание не будет видно, и все потому, что видимость определяется только на пиксельном уровне.
Традиционные методы трассировки лучей, наоборот, используют когерентные связи в объектном пространстве, реализуя пространственное деление. Луч из глаз наблюдателя проходит через структуру поделенного пространства, пока не коснется первой видимой поверхности. Как только луч достиг поверхности, уже нет необходимости рассматривать остальные поверхности в подпространствах, расположенных за первой поверхностью по ходу луча. Таким образом, исключается из дальнейшей обработки значительное количество геометрии. Получается значительное преимущество по сравнению с традиционным Z-буфером, но нет не использования когерентности в пространстве изображения и переходные взаимосвязи между кадрами.
Иерархический Z-буфер объединяет в себе силы сразу двух этих алгоритмов. Для утилизации когерентных связей в объектном пространстве используется рекурсивное деление пространства на 8 подпространств. Реализацию когерентности в пространстве изображения возложена на Z-буфер, усовершенствованный при помощи Z-пирамиды, которая позволит очень эффективно отсекать невидимые части геометрии сцены. И, наконец, для использования переходной когерентности используется уже просчитанная видимая геометрия из предыдущего кадра. Алгоритм не сложен для реализации и применим для полигонных сеток любой сложности. И чем сложнее геометрия в сцене, тем заметнее будет разница в скорости просчетов по сравнению с традиционными алгоритмами.
Для начала вся геометрическое пространство последовательно размещается в структуре дерева. Дерево рекурсивного деления пространства на восемь подпространств формируется следующим образом. Вся сцена помещается в минимально возможный, выровненный по осям координат, куб. Этот куб будет являться базовым и соответствовать началу (корню) дерева. Дальнейшая процедура является рекурсивной и начинается с проверки содержащихся в данном кубе примитивов, и если их количество меньше определенного порогового значения, то рекурсия заканчивается. Если нет, то производится деление куба далее. В результате этого получается восемь новых дочерних кубиков с размером сторон 1/2 от размеров родительского куба. Эти восемь кубиков будут представлять первую ветвь дерева. Полученные кубы снова проверяются на соответствие содержащихся в них примитивов определенному пороговому количеству, и, если необходимо, каждый не удовлетворивший условию куб будет снова поделен на восемь меньших кубиков (подпространств). Этот процесс будет продолжаться до тех пор, пока каждый из кубов не будет содержать примитивов меньше, чем пороговое значение, или пока рекурсия не достигнет своего самого глубокого уровня.
Закончив с формированием дерева, рекурсивно выполняется следующая процедура: начиная с базового куба, проверяется, попадает ли данный куб в поле зрения, если нет, на этом и заканчивается, если же да, то определяется видимость данного куба. Если куб не видим, процесс заканчивается, если видим, то визуализируется геометрия, ассоциированная с данным кубом, а затем рассматриваются его дочерние ветви (меньшие по размерам кубы) и т.д.
Алгортм обрабатывает ту геометрию, которая содержится только в видимых кубах (видимых ветвях дерева). При этом часть просчитанных примитивов может быть полностью невидимой, но все они считаются «видимыми частично». Частично видимыми они называются исходя из следующего: всегда найдется такая точка в пространстве, в которой данный полигон станет полностью видимым, и эта точка будет находиться не дальше, чем длина диагонали куба, содержащего данный полигон.
Алгоритм не тратит время на ненужные ветви дерева разбиений, так как он посещает только те ветви, родительские структуры которых видимы. Алгоритм никогда не посещает одни и те же ветви дважды.
Чтобы понизить стоимость процедуры определения видимости кубических пространств, используется Z-пирамида. Z-пирамида позволяет очень быстро определить, видимо оно или нет, исключая при этом попиксельные операции.
По сути, Z-пирамида очень напоминает собой пирамиду текстур с mip-уровнями. Смысл Z-пирамиды — это использование базового Z-буфера в качестве основания пирамиды. Это основание будет являться самым точным уровнем во всей пирамиде. Следующий, более грубый, уровень будет представлять собой набор значений, полученный путем выбора самого большого (наиболее удаленного) значения из четырех близлежащих значений предыдущего, более точного, уровня. И так далее. Таким образом, каждая, запись в пирамиде будет представлять собой максимальное значение глубины из определенной квадратной области базового Z-буфера и соответствовать определенному фрагменту экрана. Самый верхний, наиболее грубый, уровень пирамиды (ее вершина) будет представлять единственную запись, содержащую самое большое значение координаты Z из базового Z-буфера и соответствовать максимальной глубине всего изображения.
Поддерживать пирамиду в актуальном состоянии просто: каждый раз, когда обновляется значение базового Z-буфера, последовательно продвигается это значение по более грубым уровням и до тех пор, пока не встречается та запись, значение которой находится так же далеко, как новое значение Z.
Проверка на видимость при помощи Z-пирамиды осуществляется следующим образом. Находится та запись в пирамиде, которая отображает минимально возможную квадратную площадь экрана полностью содержащей исследуемый полигон. И если Z значение ближайшей вершины полигона будет дальше значения, содержащегося в этой записи, немедленно определяется, что полигон невидим. Этим методом пользуются для определения видимости как ветвей дерева, так и для определения видимости полигонов самой модели.
Если просчитывается следующий кадр анимации, то можно с большой вероятностью утверждать, что большинство кубов, видимых в предыдущем кадре, будет видимо и в следующем. Некоторые из видимых кубов станут невидимыми, а некоторые — наоборот, но когерентность между соседними кадрами в большинстве анимаций достаточно велика, и только небольшое количество кубов изменит свой статус при переходе между соседними кадрами (если, конечно, не произошла полная смена всей сцены). Создав первый кадр, создается и сохраняется перечень видимых кубов из него в виде списка. Перейдя к формированию следующего, перед тем, как с самого начала запустить иерархический алгоритм для нового кадра, проводится просчет геометрии, содержащейся в подпространствах списка. Кубы, геометрия из которых уже просчитана, помечается.
Может случиться так, что, при малой когерентности между кадрами или ее отсутствии, такой подход вынудит впустую затратить время на предварительную рендеризацию геометрии из списка, т.к. все последующие циклы рекурсии все равно будут выполнены по полной программе без какого-либо выигрыша. Поэтому необходимо предусмотреть возможность отключения использования переходной когерентности в случаях резкой смены содержимого анимационной последовательности.