Трехмерная графика

реклама
Трехмерная графика, 3D графика
Трехмерная графика - компьютерная графика для отображения
изображений, имеющих длину, ширину и глубину.
Трехмерная графика в отличие от двухмерной дает более реалистичное
представление образов
Главной целью системы трехмерного
графического синтеза является создание
высококачественных фотореалистичных
изображений со скоростью видео.
Графический конвейер
В большинстве подсистем трехмерной графики применяется
графический конвейер.
Конвейер - это логическая группа вычислений, выполняемых
последовательно, которые дают на выходе синтезируемую сцену
Конвейер разделен на множество этапов, на каждом из которых аппаратно
или программно выполняется некоторая функция. Наличием переходов
между этапами конвейера обеспечивается возможность выбора между
программной и аппаратной реализацией очередного этапа.
Такой подход к настройке конвейера позволяет приложениям трехмерной
графики получать преимущества аппаратной реализации
Реализация конвейера может чисто программной, полностью аппаратной
или смешанной (программно-аппаратной)
Описание сцены
До начала работы геометрических преобразований необходимо описать
трехмерную сцену, изображение которой необходимо синтезировать.
Трехмерное приложение оперирует объектами, описанными в некоторой
глобальной системе координат.
Чаще всего здесь используется ортогональная (декартова) система координат,
в которой положение каждой точки задается ее расстоянием от начала
координат по трем взаимно перпендикулярным осям X, Y и Z.
В некоторых случаях используется и сферическая система координат, в
которой положение точки задается удалением от центра и двумя углами
направления.
В глобальных координатах приложение создает объекты. В этом же
пространстве располагаются источники освещения, а также определяется
точка зрения и направление взгляда наблюдателя.
Правосторонняя
Левосторонняя
Геометрические преобразования
Стадия геометрических преобразований состоит из четырех этапов.
На первом этапе необходимо описать объект
Описание объекта

Объекты могут иметь разнообразную форму, описанную каким-либо
математическим способом. Проще всего иметь дело с многогранниками, у
которых каждая грань представляет собой часть плоскости, ограниченной
полигоном. Описание такого тела относительно несложно - оно состоит
из упорядоченного списка вершин.

Современные методы компьютерной графики основаны на представлении
объекта в виде набора плоских многоугольников (Практически всегда эти
многоугольники разбиваются на простейшие треугольники. На то есть
много причин — удобство работы, ограниченные возможности
оборудования, но главная — большинству алгоритмов закраски
изображения нужно, чтобы полигоны были плоскими, то есть чтобы все
их вершины лежали в одной плоскости. А для треугольников это
требование выполняется автоматически).
Объект задается вершинами, определяющими ключевые точки, и
полигонами, которые образованы линиями, соединяющими вершины. Такая
модель объекта называется проволочной.
К сожалению, картинка из одних лишь вершин (и даже вершин,
соединенных ребрами) удовлетворит далеко не всех пользователей. Поэтому
на стадии рендеринга производится удаление невидимых линий.
На втором этапе выполняются модельные геометрические преобразования,
такие как перенос, вращение и изменение масштаба.
Преобразования позволяют перемещать объекты в сцене
Элементарные геометрические преобразования
Рассмотрим элементарные геометрические преобразования (двухмерные и
трехмерные), применяемые в машинной графике - сдвиг, поворот,
масштабирование.
Сдвиг
Масштабирование
х' = х + Dx
х' = х . Sx
у' = у + Dy
у' = у . Sy
Поворот
x' = х.cosθ-y.sinθ
у' = х.sinθ-y.cosθ
Эти преобразования могут быть представлены в виде матричных операций.
Сдвиг
Р=[х, у]
Р'=[х', у'] T=[Dx, Dy]
Масштабирование
[x', y']=[x, y] + [Dx, Dy]
В векторном виде
Р' =Р+Т
| Sx 0 |
S= |
|
| 0 Sy |
Поворот (относительно начала координат)
| cosθ sinθ |
[x' у'] =[x у] |
|
| -sinθ cosθ |
P'=P . S
Р' = Р . R
Видно, что для масштабирования и поворота производится умножение на
матрицу, а для сдвига – сложение с вектором. Это неудобно.
Желательно объединить все три преобразования в одно.
Это можно сделать, представив точки в однородных координатах. Однородные
координаты были введены в геометрии.
Точка Р(х, у) записывается как P(Wx, Wy, W) для любого масштабного множителя W
не равного нулю.
Обратный
переход
от
однородных
к
декартовым
координатам
x=X/W y=Y/W
Сдвиг
Масштабирование
Поворот
Трехмерный сдвиг
Трехмерное
масштабирование

Поворот
Правосторонняя
Левосторонняя

В правосторонней системе координат, если смотреть со стороны
положительного направления оси вокруг которой происходит поворот, то
поворот против часовой стрелки переводит одну положительную ось в
другую. Поэтому поворот против часовой стрелки в таких системах
считается положительным.

В левосторонней системе координат положительными будут повороты по
часовой стрелке, если смотреть с положительного конца полуоси.
Поскольку поворот осуществляется относительно нуля, то для поворота
относительно произвольной точки необходимо произвести:
1. Перенос в начало координат;
2. Масштабирование;
3. Перенос в первоначальное положение.
Демонстрация в директории L1_3D
Стадия геометрических преобразований требует выполнения большого
объема вычислительных операций, включая операции с плавающей точкой.
Многие существующие приложения для обработки трехмерной графики
перекладывают расчеты по геометрии сцены на центральный процессор.
На третьем этапе выбираются модели освещения и вычисляется
освещенность объектов. Модель освещения описывает тип используемых
источников света и затем, когда определены свойства освещаемого объекта,
формируется эффект освещения. Общепринятые модели освещения
включают рассеянный свет, направленный и точечный источники света.
Отражающие свойства материала в сочетании с моделью освещения задают
цвет объекта.
Освещение
При создании реалистичных изображений необходимо закрашивать
поверхности.
Модель с плоским закрашиванием заключается в равномерном однородном
закрашивании каждого треугольника одним цветом (обычная заливка). В
результате объект предстает как множество плоских граней.
Закраска поверхности зависит от освещения.
Свет, падающий на поверхность от источника света, может быть поглощен,
отражен или пропущен.
Свет, отраженный от поверхности, может быть диффузным и зеркальным.
Свойства отраженного света зависят от формы и направления источника
света, а также от ориентации поверхности и ее свойств.
Для нескольких точечных источников используют эмпирическую формулу
косинусов Ламберта

Первый член в сумме отвечает за фоновое освещение. Оно одинаково для всех точек поверхности. (ka коэффициент светового отражения, показывающий, какая часть энергии отражается объектом (чем
коэффициент меньше, тем объект темнее).

Первый сомножитель во второй сумме отвечает за диффузное отражение. (I1 – интенсивность точечного
источника; d – расстояние от объекта до источника освещения; k – произвольная постоянная (для
большей естественности) ; kd - коэффициент диффузного отражения (kd – const, [0-1],θ- угол между
направлением на источник света и нормалью к поверхности.).

Второй сомножитель отвечает за зеркальное
отражение
(ks – экспериментальная постоянная,
α - угол между отраженным лучом и
вектором наблюдения,
p – степень, аппроксимирующая пространственное
распределение света).
Для расчетов, формула слишком сложна, и ее так или иначе упрощают
или сводят расчет для всей поверхности к расчету по небольшому набору
точек и интерполяции цвета поверхности на их основе.
В процедурах закрашивания по Гуро и по Фонгу цвет интерполируется
относительно границ треугольника, что приводит к более реалистичной и
непрерывной закраске объекта.
Закраска методом Гуро


Наиболее простым является метод Гуро, который основывается на
определении освещенности грани в ее вершинах с последующей
билинейной интерполяцией найденных величин на всю грань.
Рассмотрим четырехточечную грань. Пусть интенсивности в ее
вершинах известны и равны Iv1, I v2, I v3, I v4. Пусть W – произвольная
точка грани. Проведем через нее горизонтальную прямую.
Закраска методом Фонга

В этом методе интерполируются значения вектора внешней нормали,
которое затем используется для вычисления интенсивности пиксела.
Поэтому закраска Фонга требует заметно большего объема вычислений.
Но изображение получается более близким к реалистичному.

Схема интерполяции, аналогична интерполяции в закраске Гуро. Для
определения вектора нормали nW в точке W проводим через эту точку
горизонтальную прямую и используя значения векторов nU и nV в точке
пересечения U и V с ребром грани получаем

Метод Гуро обеспечивает непрерывное изменение интенсивности при
переходе от одной грани к другой без разрывов и скачков.
Слева - однотонная закраска,
справа - закраска Гуро.

Закраска Фонга требует заметно большего объема вычислений. Но
изображение получается более близким к реалистичному.
Слева - однотонная закраска,
в центре - закраска Гуро,
справа - закраска Фонга.
Сфера с закрашиванием по Фонгу
Трассировка лучей



Одним из недостатков традиционного подхода при формировании трехмерных
изображений является весьма приближенная модель освещения. Упрощенная
модель принципиально не позволяет получить многих эффектов, необходимых
для реалистичного с точки зрения освещения изображения сцены. В первую
очередь — так называемого вторичного освещения, когда некоторые затененные
части сцены слегка освещены отраженным светом. Преломления и отражения
лучей света, распространение света в среде и другие световые эффекты тоже не
рассчитываются.
Одним из наиболее распространенных и наглядных методов построения
реалистичных изображений является метод трассировки лучей (RayTracing,
рэйтрейсинг), позволяющий строить фотореалистичные изображения сложных
сцен с учетом таких эффектов как отражение и преломление.
Рассмотрим каким путем возникает реальное изображение. Выпустим из каждого
источника света пучок лучей во все стороны и мысленно проследим за ним. При
попадании луча на границу объекта выпускаем из точки попадания отраженный и
преломленный лучи и отслеживаем их и все порожденные ими лучи.



Описанный процесс называется прямой трассировкой лучей. В результате
можно получить изображение сцены однако, требуются огромные
вычислительные затраты. Основным недостатком такого способа является то, что
большая часть рассматриваемых лучей не попадает в глаз.
Метод прямой трассировки фотонов полностью универсален благодаря
приближенной к реальности модели освещения.
Поэтому чаще используется модификация метода, называемая обратной
трассировкой лучей. Суть его в том, что лучи света рассчитываются и
трассируются в обратном направлении — как бы из глаза наблюдателя.
Рассмотрим только те лучи, которые попадают в глаз. Для этого проследим путь,
который мог бы пройти луч света.

Будем идти вдоль этого луча от глаза до точки ближайшего пересечения с какимлибо объектом сцены. Цвет соответствующей точки будет определяться долей
световой энергии, попадающей в эту точку и покидающей ее в направлении глаза.

Представьте экран, через каждый пиксел которого в направлении от наблюдателя
проводится луч и трассируется до пересечения с объектом сцены. Далее
рассчитывается отраженный луч (в направлении на источник света), чтобы учесть
световую энергию, которая может быть принесена в направлении наблюдателя.
Отраженный луч, то есть, на самом деле, луч, который отразился и попал в глаз
наблюдателя, анализируется аналогично. И далее рекурсивным образом. Так
можно рассчитывать вторичное освещение, отражение и преломление света.

Глубина рекурсии характеризует качество аппроксимации освещения — чем
больше отраженных лучей проанализировано, тем выше качество и дольше
процесс вычислений.

Обратную трассировку лучей можно использовать для реалистичной
компьютерной визуализации. Она нашла широкое применение в пакетах
трехмерного компьютерного моделирования, таких как Discreet 3ds max, Lightwave
и т.п. Причем в этом случае расчет производится силами только центрального
процессора компьютера (или нескольких процессоров в многопроцессорных
системах), без привлечения трехмерных OpenGL - возможностей графических
ускорителей.

Метод трассировки лучей более ориентирован на физическое моделирование, но
благодаря высокой реалистичности используется в профессиональных задачах —
спецэффектах в кино, телевизионных роликах, мультфильмах, при
моделировании проектируемых объектов (автомобили, интерьеры, здания)
Рендеринг

Рендеринг - это процесс преобразования объекта или сцены, созданных в
приложении трехмерной графики, для вывода на дисплей, который представляет
собой двухмерную плоскость.

На стадии рендеринга по описанию треугольников генерируются пиксели
изображения.

В отличие от механизма геометрических преобразований в процессе рендеринга
объем операций с плавающей точкой не столь велик и в основном состоит из
простых операций над пикселями.
Стадия рендеринга состоит из четырех этапов.
Первый этап заключается в удалении невидимых линий.
Трехмерная сцена составлена из множества объектов со взаимным расположением по
глубине в зависимости от точки визирования.
Объекты и сцены можно вращать и наблюдать с разных позиций, в том числе
спереди, сбоку, сзади, сверху и снизу.
Позиция объекта меняется в зависимости от положения и направленности
наблюдателя.
Например, при виде спереди объект может быть видим полностью, а с положения
сзади - заслоняться другим объектом.
Алгоритм плавающего горизонта


Рассмотрим задачу построения графика функций двух переменных
z = f(x,y) в виде сетки координатных линий x = const и y = const.
Заметим, что каждая линия семейства z = f(x, yi) лежит в своей плоскости
y = yi, причем эти плоскости параллельны и, следовательно, не
пересекаются. Поэтому при yj > yi линия z = f(x,yj) не может закрывать
линию z = f(x,yi).
Метод z-буфера

Один из самых простых методов. В настоящее время один из самых
популярных. Легко реализуется аппаратно.

Сопоставим каждому пикселу (x,y) картинной плоскости, кроме цвета, его
расстояние до картинной плоскости вдоль направления проектирования
z(x,y). (глубина).

Вначале в z-буфер заносятся максимально возможные значения z, а
значения цвета соответствует фону. Затем для каждой грани она
переводится в растровое представление на картинной плоскости и для
каждого пиксела этой грани находится его глубина. В случае, если эта
глубина меньше значения глубины, хранящейся в z-буфере, пиксел
рисуется (заполняется цвет) и его глубина заносится в буфер.

Пусть некоторый многоугольник построчно преобразуется в растровую форму.
Вычисление координаты z для каждой точки сканирующей строки можно
упростить, воспользовавшись тем, что многоугольник плоский.
Уравнение плоскости Ax + By + Cz + D = 0 z = (-D-Ax-By)/C.
Теперь, если в точке (x,y) найдено значение z1, следовательно в точке (x+dx, y)

Отношение A/C – постоянно, а dx=1 поэтому, если задана глубина в точке x,y, для
вычисления глубины в точке (x+1,y) требуется выполнить лишь одно вычитание.

Недостаток метода - необходимо хранить большой z-буфер.
Построчное сканирование с z-буфером





Окно визуализации имеет высоту в одну сканируемую строку и ширину во весь
экран.
Пример: 1 х 1024 х 24 бита буфер кадра (цвета)
1 х 1024 х double z-буфер
Для каждой сканирующей строки буфер кадра инициализируется фоновым
значением интенсивности, а z-буфер минимальным значением z координаты.
Определяется пересечение сканирующей строки с двумерной проекцией каждого
многоугольника сцены.
Глубина каждого элемента плоскости вдоль отрезка, образующегося при
пересечении, сравнивается с глубиной в соответствующем элементе z-буфера.
Конечно, этот алгоритм не оптимален. Существует много модификаций этого
алгоритма. Для сокращения операций заводятся дополнительные массивы
(например: массив по y, в котором указываются многогранники имеющие
пересечение со строкой при этом значении y, и т.п.).

Другим процессом, выполняемым на первом этапе рендеринга, является
обработка альфа-буфера и смешение текстур. Эта процедура заключается
в смешении двух пикселей в сцене для получения одного составляющего
пикселя. Коэффициент альфа-канала определяет вклад каждого пикселя
при формировании составляющего. Значения коэффициентов альфасоставляющей могут быть попиксельно записаны в область памяти,
называемую альфа-буфером.

Примером использования смешения текстур является сцена,
изображающая голубое небо с просвечивающими белыми облаками.
Смешение позволяет голубому небу проступать сквозь белые облака за
счет смешения значений двух пикселей - облака и неба - в единый
пиксель.
Моделирование текстуры

Для придания более естественного вида сцене необходимо менять
параметры поверхности в зависимости от положения точек на ней.

Существуют разные способы моделирования текстуры, но практически все
они подразделяются на два основных класса:


проективные текстуры;
процедурные методы.

Представим себе, что необходимо задать определенную текстуру
(например: мрамор) какому-либо объекту.

Возможно два пути:


Взять изображение реальной мраморной поверхности и отобразить
(спроектировать) его каким-либо образом на поверхность объекта.
Построить некоторую функцию C(x,y,z), определяющую для каждой
точки пространства цвет, чтобы объект имел мраморный вид.

Первый способ наиболее прост, однако требует большого объема памяти
для хранения используемых изображений, не обладает гибкостью, очень
сложно подобрать способ проектирования для объектов сложной формы.
Поэтому в практических задачах, как правило, используется лишь
небольшое количество стандартных вариантов проектирования: плоское,
цилиндрическое и сферическое.

Второй путь не требует больших затрат памяти и одинаково хорошо
работает с объектами любой (сколь угодно сложной формы). Основным
недостатком является сложность подбора соответствующей функции.

Рассмотрим первый, в настоящее время наиболее используемый способ. Если
объект представлен в виде набора треугольников, для каждой вершины
указываются некоторые ее плоские текстурные координаты в двухмерном
изображении-текстуре. Если нужно посчитать цвет конкретной точки полигона, то
мы смотрим на ее расположение относительно трех остальных точек треугольника
и ищем аналогичную по расположению относительно «текстурных» вершин точку
в текстуре. Ее цвет и будет цветом нашей точки.

К сожалению, в этом случае для каждой точки экрана, попавшей в треугольник
сцены, нужно найти текстурные координаты (а это не слишком быстрый процесс)
и провести так называемую выборку из текстуры — вычислить цвет текстуры в
полученной точке. Последняя задача не так проста, как кажется: чаще всего
расчетная точка получается не целочисленной и попадает «между пикселами»
изображения. В итоге расчеты получаются гораздо более трудоемкими, нежели
«прямолинейное» геометрическое преобразование. Кроме того, текстуры зачастую
являются очень большими изображениями и в кэш-память процессора не
помещаются, вынуждая его непрерывно обращаться к не столь быстрой
оперативной памяти.

Вычисление цвета точки, попавшей «между» известными точками текстуры,
называется фильтрацией. Если используется простейший способ — выбрать
ближайшую к расчетной точку текстуры, — фильтрация не нужна.

Если считается взвешенное среднее арифметическое четырех ближайших
«соседей» точки, это билинейная фильтрация.

Самый «продвинутый» способ фильтрации — анизотропная (неоднородная по
разным направлениям), в которой учитываются и «физические размеры» пиксела,
то есть считается не просто проекция центра пиксела экрана на текстуру, а пиксела
целиком. Чем выше «кратность» анизотропной фильтрации, тем проекция точнее.

Использование простых способов фильтрации приводит к тому, что текстуры в
определенных ситуациях «размываются», теряют четкость. И напротив, чем
качественнее фильтрация, тем более четко прорисовываются объекты.

А вот трилинейная фильтрация — это другое.

Для оптимизации текстурной выборки, как правило, применяется техника миптекстурирования — когда для близкорасположенных объектов используется
большая и подробная текстура, а для удаленных — ее упрощенные копии.

Это хорошо заметно на гоночных симуляторах — четкая полоса дорожной
разметки по мере удаления от гонщика расплывается и в конце концов исчезает.
Чтобы не было видно резких скачков от одного мип-уровня к другому, на
переходах («не близко и не далеко») ускоритель считает линейную комбинацию
цветов, вычисленных по «ближним» и по «дальним» текстурам, — это и называют
трилинейной.
Сглаживание

На заключительном этапе рендеринга примененяется алгоритм сглаживания
(антиэлайзинг) для устранения эффекта дискретизации, ступенчатости
изображения на границе объектов. Поскольку пиксели выровнены по сетке (что
характерно для обычных дисплеев), точное представление объекта, имеющего
наклонные линии, представляется непростой задачей. Дискретизация приводит к
появлению на прямых линиях эффекта ступенчатости или зазубренности.
Алгоритм сглаживания снижает остроту проявления подобного эффекта.
Аппаратно-ускоряемые библиотеки

Для разработки компьютерной графики необходимо отдельно создавать модули
для каждого типа графических адаптеров.

Поэтому было принято решение стандартизировать метод доступа к графической
аппаратуре на уровне программного интерфейса.

OpenGL и Direct3D - две основные на сегодняшний день аппаратно-ускоряемые
библиотеки для создания компьютерной трехмерной графики. DirectX построен
по объектно-ориентированной схеме, а OpenGL по процедурной. Что лучше?

Программа на GL одинаково "хорошо" выглядит и на C++, и на чистом C, чего не скажешь о DX. Простота архитектуры
GL - неоспоримый плюс: GL работает исключительно с примитивами (треугольники, отрезки и точки) и управляется
набором булевых переменных, которые позволяют включать или отключать некоторые функции - например, накладывать
текстуру или нет, использовать ли освещение и т. д. Код для отображения "вашего первого треугольника" занимает
примерно пятьдесят строк. В DX эта цифра куда больше.

Однако при обработке одного треугольника у GL все хорошо, но как только захочется использовать что-нибудь из
современных 3D-эффектов - появляются расширения GL, и еще недавно простой и понятный код тонет в непонятных и
строках.
DirectX

Microsoft решила не изобретать велосипед, а использовать наработки компании
RenderMorphics. Это был совсем маленький проект, на его базе была создана
небольшая библиотека Game SDK, которая и стала впоследствии именоваться
DirectX 1.0 (1995).

Первой по-настоящему принятой программистским сообществом версией DirectX
стала 7.0. Этот продукт был лишен большинства из "детских болезней" своих
предшественников: научился почти полностью использовать потенциал
видеокарт, его интерфейс стал гораздо приятнее (последняя версия DirectX 11.2
(Включен в состав Windows 8.1).



Direct3D - это часть DirectX.
До седьмой версии в DirectX было два графических инструмента: Direct3D и
DirectDraw, для трех- и двухмерной графики соответственно. DirectX содержит и
другие полезные компоненты - например, DirectSound и DirectPlay. Первый
используется для воспроизведения звуков, а второй облегчает жизнь разработчику
игр: он берет на себя работу с вводом и даже включает сетевые интерфейсы.
Direct3D предоставляет разработчикам приложений трехмерной графики
интерфейс API. Использование интерфейса Direct3D дает разработчикам
возможность создавать приложения не заботясь о том, какой графический
ускоритель установлен в компьютере конечного пользователя.
OpenGL

История OpenGL ведется с 1992 года. Компания Silicon Graphics создала его как
открытый стандарт. Отсюда и первая часть названия, а GL означает Graphic Library
(графическая библиотека). На данный момент OpenGL находится под контролем
комитета Architectural Review Board (ARB), куда входят представители наиболее
влиятельных в 3D-секторе корпораций - nVidia, ATI, SGI, Apple, Intel, id
Software и, что особенно интересно, Microsoft. ARB является по сути некой
бюрократической машиной, чья задача - вводить в стандарт OpenGL новые
возможности. Для этого был создан механизм расширений. Как и любая
бюрократическая машина, ARB работает медленно и неповоротливо, что стало
главной проблемой OpenGL, который просто не может угнаться за
стремительным развитием графических технологий. Достаточно сказать, что
между выходом версий 1.0 и 1.4 прошло больше десяти лет.

Последняя версия OpenGL 4.1 (26.07.2010).

Хотя все новые возможности современных видеоускорителей доступны через
расширения ARB, пользоваться ими, прямо скажем, неудобно.
Графические ускорители

Современные трехмерные ускорители работают с так называемой полигональной
графикой, то есть любой объект представляется как набор плоских многоугольников.
Практически всегда эти многоугольники разбиваются на простейшие треугольники.

Объект задается вершинами, определяющими ключевые точки, и полигонами, которые
образованы линиями, соединяющими вершины.

Цвет на полигоны накладывается по специальным алгоритмам, как правило, с
использованием заранее нарисованных плоских изображений - текстур. Процесс этот
называется закраской. Задача 3D-акселератора сводится к тому, чтобы за заданный
промежуток времени нарисовать и закрасить как можно больше полигонов (в новейших
играх на экране одновременно присутствуют несколько сотен тысяч треугольников,
формирующих сцену).

Для отображения треугольников используется математический аппарат однородных
координат. Требуется один раз рассчитать пару матриц 4 x 4 (матрицы преобразования и
проектирования), после чего расчет положения любой точки трехмерной сцены на
плоском экране сведется к умножению вектора исходных координат на эти матрицы всего 32 умножения, 24 сложения и 3 деления.

У современного процессора на эти операции уйдет 20-40 тактов (За один такт можно
выполнить сразу несколько операций), а если задействовать векторные операции
(например, SSE/2, которые позволяют работать с векторами длины 4), то и вовсе хватит 810 тактов (для сравнения, одно обращение к оперативной памяти занимает от 100 до 350
тактов процессора).

Это, конечно, без учета "накладных расходов", но все же очевидно, что процессор с
рабочей частотой под 3 ГГц запросто может просчитать за секунду координаты десятка
миллионов точек - очень много даже по меркам современных игр (в оперативной памяти
эти точки займут не меньше 60-120 Мбайт).
Внутреннее устройство 3D-ускорителя

Сердце графического процессора (Graphics Processing Unit, GPU) - один или несколько
так называемых пиксельных конвейеров (pipelines), которые, собственно, и заняты
операциями закраски. В идеале, задача одного конвейера - за один такт закрасить одну
точку. Но поскольку сделать это за такой короткий промежуток времени невозможно,
блок закраски выполняют в виде "конвейера" - разбивают большую задачу на несколько
мелких, выполняющихся поочередно.

Реально один пиксель обрабатывается довольно долго - десятки и сотни тактов GPU, зато
одновременно конвейер обрабатывает пропорционально большее количество пикселей:
над первым выполняется первая операция конвейера, над вторым - вторая и т.д. По мере
выполнения операций пиксели переходят на следующие стадии конвейера; каждый такт
один пиксель оказывается полностью обработанным и "сходит" с конвейера, а взамен на
первую стадию поступает новый пиксель. В отличие от обычного процессора, у
графических это особых проблем не вызывает - все операции над пикселями независимы
друг от друга.

Чтобы еще повысить производительность, ставят несколько конвейеров. N конвейеров
закрасят за такт N пикселей, таким образом, предельно достижимая скорость закраски
экрана составляет N х F пикселей в секунду (где F - частота, на которой работает ядро
GPU). Частота современных чипов - от 200 до 500 МГц, число конвейеров - от 1 до 16, так
что даже простой GPU обрабатывает сотни миллионов точек в секунду, ну а мощные
ускорители способны перерабатывать миллиарды пикселей. Это в десятки раз
превосходит возможности даже самых производительных универсальных CPU.
Значительная часть вычислений пиксельного конвейера
всегда связана с использованием одной или нескольких
текстур (и с выполнением далеко не быстрой выборки
из них). Поэтому выделяют специальные текстурные
блоки (Texture Module Unit, TMU), единственная задача
которых - осуществлять выборку из текстур. На каждом
конвейере одинаковое число TMU - от одного до
четырех, и каждый такт эти модули (естественно, тоже с
использованием конвейера) в пределе способны
произвести одну выборку. И если на конвейере,
например, всего один TMU, а для проведения
вычислений над точкой нужны две текстуры (что, как
правило, в реальных играх и происходит), то текстурные
модули будут выдавать вдвое меньше данных, чем
способен обработать конвейер.

В итоге, пиксели будут сходить с конвейера не каждый такт, а, в лучшем случае, каждый
второй такт - скорость закраски упадет вдвое. Поэтому число TMU на конвейер является
вторым по важности (после числа конвейеров) параметром графического ядра. Параметр
(число конвейеров) x (TMU на конвейер) называется формулой графического
процессора.

Помимо конвейеров закраски и текстурных блоков, в GPU обязательно имеется
графическая память. Как правило (за исключением большинства интегрированных
решений), это несколько микросхем DRAM, распаянных на плате ускорителя, и
специальный
высокопроизводительный
контроллер
памяти,
интегрированный
непосредственно в GPU. Причем, для того чтобы обеспечить графический процессор
необходимым объемом данных (вспоминаем про сотни миллионов точек в секунду и про
то, что для расчета каждой нужно хотя бы 2-4, а лучше 8-16 байт информации из
текстуры), требуется очень быстрая память.

Можно поставить очень много микросхем памяти, работающих независимо, благодаря
чему за один такт будет считываться 64, 128 или даже 256 бит информации (8, 16 и 32
байта соответственно). Число это называется шириной интерфейса памяти (от него, а не
от частоты, в первую очередь, зависит производительность подсистемы памяти, так что
внимательно следите за пометками "64-bit" мелким шрифтом в прайс-листах на
видеокарты). Да и частота работы оперативной памяти на графических платах явно
выше - тут 600-1000 МГц не являются чем-то уникальным (на десктопах частоты сейчас
составляют 400-533 МГц).

Помимо текстур, в памяти хранится разнообразная геометрическая информация и
некоторые буферы, используемые акселератором в работе. Важнейший из них - фреймбуфер (frame buffer), куда складываются обработанные пиксели, и где хранятся
полностью готовые картинки. Специальный буфер нужен потому, что вывод и
формирование картинки не зависят друг от друга - монитор ждать окончания расчета
очередного пикселя не будет, ему нужно непрерывно получать видеосигнал.

Для этого используется специальный цифро-аналовый преобразователь RAMDAC (RAM
Digital-to-Analog Convertor - ЦАП памяти), который непрерывно читает фрейм-буфер и
формирует сигнал, передаваемый через дополнительные схемы на выход видеокарты.
Аналогично могут формироваться цифровые или телевизионные выходные сигналы. У
современных GPU - несколько RAMDAC, позволяющих одновременно и независимо
выводить видеосигналы на несколько устройств.

Рассмотрим устройство графической подсистемы. Ее работа организуется в форме
конвейера. Информация проходит все стадии конвейера, прежде чем преображается в
видимый на экране образ.

Рассмотрим устройство графической подсистемы. Ее работа организуется в форме
конвейера. Информация проходит все стадии конвейера, прежде чем преображается в
видимый на экране образ.
В самом начале располагается блок обработки вершин трехмерной сцены,
целью которого является выработка данных о каждой вершине: ее
положение в экранной системе координат, пара цветов (диффузный и
зеркальный), до восьми текстурных координат. Следует напомнить, что
текстурными называют координаты на отдельно хранящемся растровом
изображении (текстуре). Их задание в каждой вершине треугольника
позволяет привязать нужную часть изображения к этому треугольнику.
Входные данные отдельно для каждой вершины поступают от программного
приложения. Как правило, передаются координаты и нормали вершин в системе модели,
которые по известным характеристикам, положению и направлению взгляда камеры
трансформируются в экранные координаты. Цвета определяются взаимным
расположением вершины, камеры и источников освещения. Отсюда и принятое название:
блок трансформации и освещения (T&L). Обработка вершин происходит независимо,
здесь система еще не знает, как они связаны между собой.
Информация о том, какие тройки вершин образуют треугольники, поступает только на
следующий этап конвейера, носящий название "сборка треугольников" (triangle setup).
После этого уже можно определить, какие треугольники будут не видны на экране.
Независимым исследованием вершин этого установить нельзя: три выходящие за границы
экрана вершины могут сформировать частично видимый треугольник. Полностью
скрытые треугольники удаляются, чтобы больше не отнимать на себя ресурсов. От
частично видимых треугольников отсекаются ненужные части.

На этапе растеризации треугольники разбиваются на множество фрагментов, каждый из
которых соответствует одному пикселу экрана, накрываемому треугольником. Здесь же
происходит еще одна важная операция - линейная интерполяция значений из вершин
треугольника в соответствии с положением фрагмента. После этого обработка каждого
фрагмента может происходить автономно от других фрагментов.

В конечном результате для каждого фрагмента необходимо определить его итоговый цвет
и глубину. Для этого часто требуется доступ к хранящимся в видеопамяти текстурам,
которые могут содержать как непосредственно цвет, так и освещенность, отражательную
способность или карту неровностей. Доступ к текстурам осуществляется через блок
выборки (fetch), который может вернуть цвет текстуры в произвольной точке, а также
может выполнять билинейную или анизотропную фильтрацию.

Свое окончание конвейер находит в экранном буфере или текстуре, его заменяющей, при
включении специального режима render-to-texture. Это единственное место в конвейере,
которое доступно приложению для обратного считывания (read back).
Шейдеры

Шейдер - короткая программа для одной из ступеней графического конвейера,
позволяющая программировать графический ускоритель. На практике шейдер - некая
последовательность машинных кодов, которую разработчик, как правило, описывает на
специальной разновидности ассемблера.

В настоящее время шейдеры делятся на три типа: вершинные, геометрические и
фрагментные (пиксельные).



Вершинные
шейдеры
(Vertex
Shader)
оперируют
данными,
сопоставленными
с
вершинами многогранников. К таким данным, в частности, относятся координаты вершины в
пространстве, текстурные координаты, тангенс-вектор, вектор бинормали, вектор нормали.
Вершинный шейдер может быть использован для видового и перспективного преобразования вершин,
генерации текстурных координат, расчета освещения и т. д.
Геометрические шейдеры (Geometry Shader) в отличие от вершинного, способны обработать не
только одну вершину, но и целый примитив. Это может быть отрезок (две вершины) и треугольник
(три вершины), а при наличии информации о смежных вершинах (adjacency) может быть обработано
до шести вершин для треугольного примитива. Кроме того геометрический шейдер способен
генерировать примитивы «на лету», не задействуя при этом центральный процессор.
Пиксельные шейдеры (Pixel Shader) работают с фрагментами изображения. Под фрагментом
изображения в данном случае понимается пиксель, которому поставлен в соответствие некоторый
набор атрибутов, таких как цвет, глубина, текстурные координаты. Фрагментный шейдер используется
на последней стадии графического конвейера для формирования фрагмента изображения.

Шейдеры позволяют создавать сложнейшие эффекты в реальном времени. Изначально
эти программы можно было писать только на "фирменных" языках производителей
видеокарт - ATI и nVidia. Оба языка очень похожи на ассемблер, но, увы, несовместимы.
А кому захочется писать два разных кода для реализации одного и того же эффекта?
Поэтому появились шейдерные языки.

Шейдерный язык OpenGL носит название GLSL (The OpenGL Shading Language). GLSL основан на
языке ANSI C. Большинство возможностей языка ANSI C сохранено, к ним добавлены векторные и
матричные типы данных, часто применяющиеся при работе с трехмерной графикой. В
контексте GLSL шейдером называется независимо компилируемая единица, написанная на этом
языке. Программой называется набор откомпилированных шейдеров, связанных вместе.

nVidia совместно с Microsoft разработала язык Cg (C for Graphics) (такой же по сути язык
от Microsoft называется HLSL, включён в DirectX 9). Язык очень похож на C, он использует схожие
типы. Поддерживаются функции и структуры. Несмотря на то, что язык разработан nVidia, он без
проблем работает и с видеокартами ATI. Однако следует учесть, что все шейдерные программы
обладают своими особенностями, которые следует получить из специализированных источников.

Низкоуровневый шейдерный язык DirectX (DirectX ASM) по синтаксису сходен с Ассемблером.
Высокоуровневый шейдерный язык DirectX (HLSL — High Level Shader Language)


К сожалению алгоритм трассировки не может быт реализован на
специализированных
графических
ускорителях,
которые
реализуют
графический конвейер.

Графические адаптеры семейства Tesla (корпорации NVIDIA) по своей природе
являются специализированными вычислительными устройствами.

Tesla оснащена 240 ядрами, при помощи которых Tesla может работать с
программами развивающими до 1024 потоков на процессорах видеоадаптера. 4
Гб встроенной памяти выгодно отличают данного представителя графического
адаптера разработанного корпорацией NVIDIA от других линеек адаптеров,
таких как GForce и Quadro. Реализован режим работы с плавающими числами
как одинарной, так и двойной точности. Среди прочих достоинств данного
продукта можно выделить низкое энергопотребление, компактность, и
стоимость.

Размер адаптера Tesla ненамного превышает размеры обычного видеоадаптера.


Если в корпусе компьютера установлены несколько адаптеров Tesla, то они
могут быть соединены посредством специальной шины, что позволяет
производить копирование данных между адаптерами в обход материнской
платы.
Вычислительный процессор NVIDIA® Tesla C1060 для ПК (слева) и Tesla S1070
для сервера (справа)


NVidia не единственные на рынке GPU. Основным противником Tesla является
графический процессор FireStream фирмы AMD.
Можно отметить что продукция компании AMD рассчитана только на ПК,
однако карты FireStream имеют графический выход (процессоры Tesla
графического выхода не имеют).
Вычислительный процессор AMD® FireStream 9270 для ПК
Скачать