От граненого Тора до визуализации гладкой поверхности Тор, нарисованный в виде полигональной сетки, выглядит граненым, а не гладким. Цель состоит в том, чтобы отобразить его как гладкую поверхность, сохраняя при этом растеризацию полигонов. Проблема заключается в затенении гладких поверхностей, которые аппроксимируются полигональными сетками. Для достижения визуально гладкого результата рассматривается несколько подходов.
Наивное решение: Увеличить количество полигонов и их стоимость Один из вариантов - разделить сетку таким образом, чтобы каждая грань была размером примерно в пиксель. Увеличение размера тора с 20×20 до примерно 100×100 значительно снижает производительность, в то время как грани остаются заметными. Даже при меньших затратах на съемку снижение частоты кадров очевидно. Высокую тесселяцию легко попробовать, но это не самый лучший способ.
Аппроксимация криволинейного участка поверхностями Безье Другая идея заключается в аппроксимации с помощью участков криволинейной поверхности вместо плоскостей. Трехмерные сплайны, особенно поверхности Безье, могут представлять гладкие формы при относительно небольших вычислениях. Такие участки могут быть большими, но при этом плотно прилегать к тору. Хотя этот путь широко используется, он здесь не реализован.
Попиксельное аналитическое затенение и компромиссы в трассировке лучей Третий подход использует аналитические уравнения поверхности и затеняет каждый пиксель. Для таких примитивов, как тор, цилиндр, конус или сфера, нормали и освещенность могут быть рассчитаны для каждого пикселя и объединены с помощью Z-буфера. Трассировка лучей воплощает в себе эту попиксельную философию, но для реального времени она требует больших вычислительных затрат. В лекции для интерактивного рендеринга используется нечто другое.
Рассеивание света по граням для придания им гладкости Выбранный метод сохраняет грубую полигональную сетку, но затемняет ее, чтобы она выглядела гладкой. Цвета "размазываются" по граням, чтобы скрыть края, как будто вы растушевываете карандашные штрихи пальцем. Два классических алгоритма позволяют добиться такого сглаживания: растушевка по Гуро и растушевка по Фонгу. Фокус начинается с растушевки по методу Гуро.
Вершинные нормали как практическая основа В реальных инструментах нормали к граням часто не сохраняются; вместо этого нормали привязываются к вершинам. Нормаль к вершине должна приближаться к истинной нормали к гладкой поверхности в этой точке. Когда доступно явное уравнение поверхности, можно использовать именно эти нормали. В противном случае нормали к вершинам оцениваются по смежным граням.
Вычисление нормалей к вершинам путем усреднения нормалей к граням Нормали к граням получаются из перекрестных произведений векторов ребер и нормализуются к единице длины. Для каждой вершины суммируются нормали всех соседних граней. Затем результирующий вектор нормализуется для формирования нормали к вершине. Это усреднение обеспечивает направления, соответствующие гладкой подстилающей поверхности.
Освещение каждой вершины с учетом условий Ламберта и окружающей среды При известных нормалях к вершинам освещение вычисляется в вершинах. Косинус Ламберта с внешней составляющей определяет интенсивность; если косинус отрицательный, то влияет только внешняя составляющая. Зеркальные (фонговые) термины могут быть включены в вершины, но лекция посвящена Ламберту, чтобы снизить затраты. Значения интенсивности хранятся в данных о вершинах.
Преобразование сканирования Гуро и интерполяция интенсивности Каждый полигон заполняется линиями развертки с использованием той же стратегии обхода по контуру, а затем горизонтальной заливки, что и при Z-буферизации. Вдоль каждого ребра интенсивность линейно интерполируется по мере продвижения Y вместе с глубиной; горизонтальные ребра пропускаются, а в Y используется шаг, подобный шагам Брезенхема, чтобы избежать ошибок, близких к горизонтальным. Для каждого сегмента линии сканирования известны начальная и конечная интенсивности, которые увеличиваются на постоянную величину на пиксель, что требует добавления одного пикселя. Передняя/задняя сторона определяется точкой, указывающей направление обзора перед заполнением.
Непрерывные Цвета По Общим Краям Когда смежные полигоны имеют общие вершины, их интерполированные цвета пересекаются на общем ребре без перехода. Прерывистой может быть только производная, поскольку углы наклона граней различаются, но значения остаются непрерывными. Это устраняет резкие разрывы по краям при плоском затенении. Метод искусственный, но визуально эффективный.
Указания по внедрению нормалей и преобразований Нормали граней накапливаются непосредственно в нормалях всех вершин каждой грани во время цикла обработки граней, что позволяет избежать поиска смежности. После накопления все нормали вершин нормализуются. Нормали преобразуются поворотом (без перемещения) по мере анимации сетки. Эта настройка полностью интегрируется с конвейером Z-buffer.
Гуро на торе: Крупная сетка, гладкий вид Тор размером 10×10 или 20×20 геометрически огранен, но растушевка Гуро плавно смешивает тона. При размере 30×30 граней становится трудно заметить из-за растушевки. Частота кадров остается приемлемой по сравнению с экстремальной тесселяцией. Переключение показывает контраст с плоским затенением.
Почему зеркальные блики исчезают с Гуро Гуро интерполирует интенсивность, поэтому, если все четыре вершины прямоугольного участка имеют одинаковую интенсивность, внутренняя часть остается такой же. На участке, освещенном спереди, в центре должна быть зеркальная подсветка, но интенсивность вершин там одинакова и ее не видно. В результате теряется изюминка. Это основная слабость Gouraud в отношении глянцевых поверхностей.
Фоновое затенение Интерполирует Нормали, А не Интенсивности Схема интерполяции Фонга переносит вершинные нормали по всей поверхности, создавая уникальную нормаль для каждого пикселя. Затем для каждого пикселя вычисляется освещение, включая зеркальный коэффициент Фонга. Центр участка, освещенного спереди, приобретает нормальный вид, выравниваясь по освещенности и обзору, восстанавливая подсветку. Визуальный результат превосходен, но требует больших вычислительных затрат.
Фонг на Торе: красота по цене Благодаря попиксельным нормалям и полной оценке фонового состояния тор демонстрирует естественные, яркие блики на выпуклых и вогнутых участках. Поверхность выглядит по-настоящему гладкой, несмотря на наличие сетки. Однако при тех же условиях частота кадров падает до нескольких кадров в секунду. Стоимость зависит от нормализации каждого пикселя по нормали и многократных косинусных вычислений.
Цилиндры Демонстрируют соотношение матовости и глянца В режиме Gouraud цилиндр выглядит матовым; его торцевая крышка, если ее повернуть к свету, приобретает равномерно более яркий оттенок. В режиме Phong глянцевая подсветка белая и локализованная, а ее расположение вдоль генератора меняется в зависимости от точки обзора и геометрии освещения. Затенение каждого пикселя пересчитывается, поэтому при необходимости заглушка получается неоднородной. Улучшенная реалистичность сопровождается заметным замедлением.
Более быстрое выделение с помощью карты отражений Чтобы фиксировать блики без полного расчета на пиксель, используется аппроксимация карты отражения. Предположим, что и источник света, и наблюдатель находятся на бесконечности, поэтому интенсивность зависит только от направления нормали. В геометрии по-прежнему используется центральная проекция, но затенение сводится к функции ориентации по нормали. Предварительный расчет этой функции позволяет удешевить рендеринг.
Описание нормали двумя углами Единичная нормаль, обращенная к наблюдателю, параметризуется двумя углами, измеренными от оси Z: одним в плоскости ZX и одним в плоскости ZY. Когда оба угла равны нулю, нормаль указывает на +Z; допустимые углы составляют примерно ±90 градусов, когда поверхность обращена к наблюдателю. Эти два параметра заменяют три обычных компонента для интерполяции. Изображение предназначено только для полупространства, видимого камере.
Предварительное вычисление таблицы зеркального поиска Угловая область дискретизируется в виде сетки, и для каждой пары углов интенсивность модели Фонга вычисляется один раз. Результирующая таблица представляет собой карту отражения. Крупнозернистая сетка, например, 180×180, создает полосы и неравномерное затенение, поэтому разрешение увеличивается (например, до 250 шагов) для уменьшения искажений. Потребности современного оборудования в памяти невелики.
Время выполнения: Интерполяция углов, Выборка интенсивностей В вершинах вычисляются и сохраняются два нормальных угла. Вдоль ребер и по линиям сканирования эти углы интерполируются точно так же, как глубина или интенсивность. Для каждого пикселя интерполированные углы округляются до ближайших табличных значений, чтобы получить предварительно вычисленную яркость. Этот метод дает небольшое ускорение и лучшие блики, чем при использовании метода Гуро, хотя и не драматичен. Плоские лица становятся равномерно затененными в соответствии с предположением о бесконечном просмотре.
Когда растушевка Гуро сияет Растушевка по методу Гуро хорошо подходит для создания гладких форм, таких как тор или сфера, аппроксимируемых сеткой с относительно небольшим количеством граней. Она не подходит для таких задач, как каркасный рендеринг или отображение четких граней куба. На экзаменах это преподносится как метод получения гладких поверхностей с помощью грубых полигональных приближений. Геометрия остается грубой; штриховка придает гладкость.
Видимость объекта в пространстве с помощью BSP Разделение бинарного пространства позволяет улучшить видимость, работая в пространстве объекта, а не в пространстве изображения. Плоскость разделения делит пространство на два полупространства; с точки зрения зрителя, одна сторона не может быть закрыта другой. Рендеринг в правильном порядке спереди/сзади обеспечивает надлежащее перекрытие без использования Z-буфера. Основная идея элегантна и не зависит от просмотра.
Упорядочение с помощью рекурсивных разбиений пространства Выберите плоскость таким образом, чтобы некоторые объекты находились на одной стороне, а другие - на другой, а зритель находился в одном полупространстве. Объекты на стороне зрителя могут скрывать объекты на дальней стороне, но не наоборот, поэтому их нужно будет нарисовать позже. Повторение разбиения для каждой стороны определяет порядок рендеринга: рисуем более дальний объект, затем более близкий. При использовании нескольких объектов дополнительные разбиения уточняют порядок.
От идеальных плоскостей к практичным деревьям BSP В реальных сценах редко удается найти плоскости, которые четко разделяют объекты. Полигоны часто располагаются на плоскости, поэтому они должны быть разделены этой плоскостью. Использование собственных плоскостей полигонов в качестве разделителей приводит к бинарному дереву, в котором каждый узел хранит один разделяющий полигон. Промежуточные элементы вырезаются и распределяются по передним и задним поддеревьям.
Построение BSP путем классификации и разделения Начните с выбора начального полигона в качестве корневого разделителя. Для каждого последующего полигона классифицируйте его как полностью расположенный впереди, полностью позади или пересекающий корневую плоскость; отправьте его в левое или правое поддерево соответственно, разделив его, если необходимо. Рекурсивно повторяйте это с разделителем поддерева на каждом шаге. Этот процесс увеличивает количество полигонов, потому что многие из них разделяются.
Предварительный расчет для статичных миров Дерево BSP не зависит от положения наблюдателя, а только от взаимного расположения полигонов. Для статичных сред оно может быть построено полностью заранее, даже до запуска программы. Это делает его идеальным для комнат, стен, полов и мебели, которые никогда не перемещаются. Известные примеры включают использование BSP для определения геометрии уровней в таких играх, как Wolfenstein и Doom, в то время как перемещение персонажей зависит от Z-буфера.
Структуры данных для сцены на основе BSP Запись сцены содержит указатель на корень дерева BSP и глобальный связанный список вершин. Каждый полигон хранит циклический список указателей на свои вершины вместо дублирования координат, а также указатели на левое и правое поддеревья. Также поддерживается многопоточный линейный список полигонов для их перечисления при необходимости. Вершины должны быть изменяемыми, поскольку при разбиении появляются новые.
Следующие шаги и завершение С внедрением технологий затенения и концепций BSP планируется внедрить представление на основе BSP. Форма BSP соответствует статической геометрии, в то время как динамические актеры придерживаются рендеринга с использованием Z-буфера. В конце сеанса мы поощряем зрителей продолжать просмотр и беззаботно завершаем просмотр. Практические подробности по кодированию приведены в следующем разделе.