Современные технологии отображения интерактивной трехмерной графики

Часть 1. Обобщенный графический конвейер


Введение

Последние года три мы наблюдаем бурное развитие технологий отображения трехмерной графики. Сегодня уже можно констатировать значительные, я бы даже сказал, революционные изменения как в качестве, так и в скорости интерактивного 3D, как в компьютерных играх, так и в более "серьезных" приложениях вроде пакетов трехмерного моделирования, анимации и разработки спецэффектов. Эти изменения прочно связываются с именем nVidia, компании-возмутителя спокойствия, инициировавшей технологические новшества и новые стандарты, о которых теперь говорят все и речь о которых пойдет ниже.

Вкратце, революции нужно делать так: GeForce 256 - расширение аппаратных возможностей расчета видеокарт и введение вершинных и пиксельных шейдеров; GeForce 2 GTS - появление возможности программирования пиксельных шейдеров; GeForce 3 и 4 - введение полноценной программируемой пользователем RISC-архитектуры видеокарт и тем самым устранение принципиальной разницы между качеством интерактивного 3D и качеством "киношных" спецэффектов. На последней выставке SIGGRAPH`2002 nVidia продемонстрировала просчет сцен из фильма Final Fantasy в режиме реального времени на чипе нового поколения NV 30.

Далее - для тех, кого интересуют подробности.


Обобщенный графический конвейер

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


Данные, передаваемые для отображения

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

В самом общем случае описание трехмерной сцены в современных приложениях, будь то графический движок какой-нибудь игры или программа трехмерного моделирования, содержит: список видимых в видовом окне объектов; уровень детализации объектов в зависимости от их удаленности от видового окна или камеры; описание систем координат; положение, размер и форму объектов сцены; описание свойств поверхности каждого из объектов - цвета, прозрачности, взаимодействия со светом, текстурных координат и текстур; обязательно описываются координаты источников света и тип их излучения, а также координаты и параметры видовых окон и камер, присутствующих в сцене. Уф!


Полигонное представление формы

Для построения формы объектов используется как полигонное представление, так и аналитическое, с помощью математических формул. Полигонное представление используется наиболее часто, поскольку математические формулы известны далеко не для всех поверхностей. С другой стороны, полигонное представление позволяет с той или иной точностью представить любую поверхность и больше подходит для расчетов методами вычислительной математики.

Что из себя представляет полигонное представление? Грубо говоря, это совокупность полигонов, сложенных вместе наподобие мозаики таким образом, чтобы как можно точнее воспроизвести требуемую форму. Под полигоном понимается плоский многоугольник (т.е. многоугольник, все вершины и ребра которого лежат в одной плоскости), составленный из треугольников. Чем меньше полигон, тем большее их количество используется для воссоздания поверхности, тем точнее представление (рис .1).

Рис.1. Увеличение количества полигонов позволяет точнее представить форму

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

Поэтому все данные об объекте, передаваемые приложением, - это данные о вершинах объекта (координаты, цвет, нормали, текстуры, спецэффекты и пр.). Забегая немного вперед, следует сказать, что чем меньше данных готовится процессором (приложением) и чем больше рассчитывается видеокартой, тем лучше. Но даже если вся вышеперечисленная информация готовится приложением, на долю видеокарты все равно остается немало работы - необходимо пересчитать все вершинные данные для каждого пиксела экрана, которых тем больше, чем выше разрешение окончательной картинки (см. рис. 2, 3).

Рис. 2. Именно в таком виде приложение передает объект видеокарте - координаты вершин и их цвет, и видеокарте этого вполне достаточно.


Рис. 3. А вот человек, если только его зовут не Neo, вряд ли сможет понять, что это должно выглядеть так.


Системы координат

Форма, размер и положение в сцене любого объекта в полигональном представлении однозначно определяется трехмерными координатами вершин полигонов, его составляющих. Для того, чтобы вершины объекта могли иметь координаты, в сцене вводятся системы координат. Как правило, их три. Первая, так называемая "мировая система координат", используется для описания всего трехмерного мира целиком, другими словами, всех объектов данной сцены и их взаимного положения.

Вторая - система координат наблюдателя (СКН). Необходимость введения СКН обусловлена несколькими важными причинами. Прежде всего, мы получаем возможность перемещаться по сцене. Далее, СКН позволяет сузить все трехмерное пространство сцены до зоны видимости данного видового окна или камеры. Разумно передавать на счет только те объекты, которые находятся в зоне видимости, и исключать из отображения те объекты, которые находятся вне такой зоны, например, позади камеры. Зона видимости формируется шестью плоскостями отсечения (см. рис. 4).

Рис. 4. Две верхних, две боковых, задняя и передняя - вот грани, образующие зону видимости. Автомобиль не попадает в зону видимости, так же, как и часть замка и двора. На рисунке показаны мировая система координат (левый нижний угол) и система координат наблюдателя (камера).

И, наконец, в СКН математическое представление координат гораздо проще, проще и математические расчеты. Например, можно выбрать такую СКН, при которой Z-координата вершины сразу определяет глубину вершины в сцене (расстояние до камеры) и может без преобразований записываться в Z-буфер видеокарты. Если бы для этих целей использовалась мировая система координат, то для расчета глубины вершины, скорее всего, пришлось бы использовать все три мировые координаты x, y, z и рассчитывать расстояния относительно наблюдателя (видового окна или камеры).

Еще одна система координат - плоская (двухмерная) система координат - используется для проектирования трехмерных объектов на экран.


Этапы отображения трехмерных данных

Теперь мы знаем, какая информация передается на отображение, и знаем также, что большая часть этой информации - это различные данные о вершинах объектов. Давайте посмотрим, какой путь проходят эти данные до момента отображения на экране.


Этап первый. Трансформация

Наличие нескольких систем координат приводит к необходимости преобразования координат вершин и нормалей между ними - приложение содержит описание вершин в мировой системе координат, для отображения используется проекция СКН на плоскость, и поэтому необходимо знать координаты вершин в каждой из этих систем. Операция преобразования координат между различными системами называется трансформацией и с математической точки зрения описывается матрицей из 16 чисел (4х4 - 4 строки по 4 столбца), вершина или нормаль описываются 4 цифрами - три координаты и четвертая используется для перспективной коррекции. Я не буду углубляться в математические тонкости, нам достаточно знать, что любой поворот, трансляция или масштабирование объекта представляют собой умножение векторов всех вершин объекта на одну и ту же матрицу преобразования. Конечно же, перемещение наблюдателя или объектов в сцене тоже связано с преобразованиями координат и также является трансформацией.


Этап второй. Освещенность

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

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

Далее, у всех видимых объектов есть задняя, невидимая, сторона. Для отсечения полигонов задней стороны объекта анализируется значение направления нормали. Если нормаль "смотрит" от камеры (окна), такой полигон будет невидим и его тоже можно выбросить.

И, наконец, выбрасываются полигоны, полностью скрытые другими полигонами, расположенными ближе к камере (видовому окну) по глубине, частично перекрытые полигоны, опять же, сохраняются (см. рис. 5 и 6).

Рис. 5 и 6. Часть полигонов куба, скрытая шаром, может и должна быть отсечена.

Сохранение частично видимых полигонов необходимо, поскольку отбрасывание вершины автоматически приводит к отбрасыванию целого треугольника. На этой стадии нельзя разделить частично видимый полигон на полностью видимую и полностью невидимую части из-за невозможности строить новые точки-вершины. Но это станет возможным позднее, когда расчеты отображения перейдут на попиксельный ("точечный") уровень (см. рис. 7).

Рис. 7.

Для расчета освещенности вершин, оставшихся после отсечения, вычисляются расстояния от каждой вершины до всех источников света, от каждой вершины до экрана, а также углы между направлением на источник света и нормалью вершины. Все современные видеокарты рассчитывают только рассеянную (diffuse) и отраженную (specular) компоненты освещения. Связано это с тем, что для вычисления непрямого освещения (radiosity) или вычисления истинных преломлений и отражений методом трассировки лучей требуется описание всех объектов сцены, а на видеокарту передается только то, что попадает в зону видимости. Кроме того, такие расчеты требуют больших ресурсов и много времени, так что в ближайшем будущем такие вычисления останутся, скоре всего, уделом процессора. Кстати говоря, освещенность методом radiosity, если она предварительно рассчитана, все же может участвовать в формировании изображения в виде дополнительных параметров вершин, передаваемых приложением.


Этап третий. Текстурирование

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

Для наложения текстур необходимы текстурные координаты (ТК). По сути, текстурные координаты - это способ сопоставления вершин и участков двухмерного растрового изображения текстуры, другими словами, это способ сопоставления трехмерных координат вершин и двумерных координат пикселов текстуры.

Такое сопоставление чаще всего определяется приложением: например, в 3d studio max это координатные карты типа plane, box, sphere, cilinder и т. д. В любом случае, координатные текстуры могут передаваться, а могут и генерироваться самой видеокартой. Видов текстурирования множество, и полноценная генерация ТК-видеокартой возможна, только если вместе с данными будет загружаться и программа их обработки. Кроме генерации координат для текстур, часто требуются дополнительные расчеты, например, билинейная и анизотропная фильтрация, mip-mapping, сглаживание и др.


Этап четвертый. Попиксельная интерполяция

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

На экране изображение состоит из единичных элементов изображения, пикселов. И для отображения объектов совершенно недостаточно одних только вершин, их необходимо "достроить" пикселами. Точнее, если бы могли уменьшить полигоны до размера пиксела, попиксельная интерполяция была бы не нужна. Но это невозможно из-за ограничений производительности и объема памяти (см. рис. 8).

Рис. 8. Пикселы - экранные «кирпичики», с помощью которых из вершин строится окончательное изображение. Процесс построения этих «кирпичиков» начинается с интерполяции трехмерных координат вершин.

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

После пиксельной интерполяции трехмерных координат можно произвести окончательное отсечение по ширине и высоте видового окна частично видимых полигонов. Зная координаты всех пикселов данного треугольника, можно построить дополнительные вершины так, чтобы разбить треугольник на две части - полностью видимую и полностью невидимую - и отсечь невидимый полигон (см. рис. 9).

Рис. 9. Отсечение невидимой части полигона.

Далее выполняется интерполяция цвета, прозрачности и текстуры пиксела по соответствующим значениям вершин, например, градиентными растяжками. Для корректной интерполяции попиксельной освещенности требуется знать нормали каждого пиксела, которые могут быть интерполированы из нормалей вершин (см. рис. 10).

Рис. 10. Линейная интерполяция освещенности полигона.


Этап пятый. Визуализация

Для формирования итогового цвета пиксела все рассчитанные величины смешиваются по определенным алгоритмам, затем формируется таблица пикселов (буфер экрана). Это повторяющийся, или многопроходный, процесс, поскольку мы должны записать трехмерную сцену в двухмерную матрицу. Неизбежны случаи, когда несколько пикселов должны быть записаны в одну и ту же ячейку. Для определения того, какой пиксел должен быть записан, а какой отброшен или переписан, используется механизм Z-буфера, содержащий информацию о глубине отображаемого пиксела относительно плоскости экрана. Перед записью очередного пиксела в данную ячейку таблицы сравниваются значение его z-координаты и z-координаты, соответствующей данной ячейке (если туда уже что-то писали, если нет - там будет хранится нулевое значение). Если z-координата пиксела меньше текущего значения z-координаты ячейки (т.е. пиксел ближе к камере), пиксел записывается в ячейку, а его z-координата присваивается ячейке (z-координаты отображаемых пикселов хранятся в специальной памяти, называемой Z-буфером). Полностью сформированная таблица посылается для отображения.

Процесс можно считать завершенным.

В приведенной ниже схеме собраны вместе все этапы построения изображения.


Данные о трехмерной сцене, передаваемые приложением:

основные:

  • список видимых объектов;
  • уровень детализации в зависимости от удаленности объекта;
  • системы координат;
  • координаты вершин объекта в полигонном представлении или формулы аналитического представления;
  • цвет вершин;
  • описание источников цвета;
  • текстуры;

дополнительные:

  • текстурные координаты вершин;
  • прозрачность (альфа-данные) вершин;
  • другие данные для вершин, обычно связанные с различными спец-эффектами, например, объемным туманом, тенями и др.


Этапы обработки:

TRANSFORM

  • тесселяция аналитических поверхностей (все-таки эта операция, скорее всего, выполняется самим приложением, а не видеокартой);
  • трансформация;
  • отсечение на уровне полигонов;

LIGHTNING

  • расчет освещенности;
  • наложение текстур;

TRIANGLE SETUP & CLIPPING

  • интерполяция координат пикселов;
  • отсечение на уровне пикселов;
  • интерполяция данных вершин на пикселы - цвета, текстурных координат и текстур, прозрачности, освещенности, данных спецэффектов;

RASTERIZING

  • вычисление результирующего цвета пикселов;
  • формирование буфера экрана с учетом Z-буфера;
  • отображение содержимого буфера экрана.

Появление в таблице подгрупп TRANSFORM - LIGHTNING - TRIANGLE SETUP & CLIPPING - RASTERIZING следует принятому для видеокарт и цитируемому в различной литературе делению графического конвейера на этапы. Будем и мы следовать установившейся терминологии. Раз уж речь зашла о терминологии, давайте дадим еще несколько определений. Графический конвейер - это совокупность этапов обработки данных, программ расчетов (называемых также шейдерами) и аппаратных ресурсов, на которых считаются эти программы и где хранятся данные. Соответственно, вершинные шейдеры - программы и ресурсы для расчета данных вершин, пиксельные шейдеры - то же, но для пикселов. Можно считать, что transform и lightning - это этап вершинных шейдеров, а trianglesetup&rendering - этап пиксельных шейдеров. А весь графический конвейер можно разбить еще одним способом - этап обработки вершин и этап обработки пикселов.

Пожалуй, вот и все, что пока можно сказать об обобщенном графическом конвейере. В следующей статье мы рассмотрим особенности аппаратной реализации графического конвейера на примере видеокарт серии GeForce от nVidia.

Игорь СИВАКОВ

Версия для печатиВерсия для печати

Номер: 

39 за 2002 год

Рубрика: 

Графика
Заметили ошибку? Выделите ее мышкой и нажмите Ctrl+Enter!