Этап трансформаций и освещения (transform and lighting, T&L) обеспечивает преобразование позиций вершин и трансляцию системы координат модели в мировую систему координат и систему координат камеры. Вычисления освещенности для каждой вершины выполняются для определения отраженной и рассеянной цветовых компонент (specular and diffuse color components). Затем позиции вершин модифицируются в ходе трансформации проекции (projection transformation), чтобы получить перспективную проекцию (perspective projection), ортогональную (orthographic projection) или другого типа. Хотя конвейер стандартных функций по-прежнему предоставляет эти алгоритмы T&L через тот же API, что и раньше, в большинстве графических плат они могут быть реализованы на уровне микрокода графического процессора. Так, в процессоре Radeon 9700 весь модуль T&L можно и нужно реализовать в программируемом конвейере как вершинные шейдеры (vertex shaders).
Для большего быстродействия на этапе растеризации любые вершины невидимых камере объектов вырезаются (clip). А чтобы избежать растеризации треугольников, отвернутых от камеры, может выполняться операция отсечения невидимых поверхностей (back-face culling). Более того, для выбора и настройки реальных алгоритмов, которые будут задействованы на этапе растеризации, используется оценка атрибутов (attribute evaluation). Наконец, после всех этих оптимизаций начинается собственно растеризация, в ходе которой осуществляется рендеринг пикселов.
На этапе обработки пикселов вы можете использовать для определения значения цвета (color value) пиксела либо мультитекстурирование на основе стандартных функций (fixed-function multi-texturing), либо программируемые пиксельные шейдеры (pixel shaders). Мультитекстурирование на основе стандартных функций реализуется за счет многопроходного наложения текстур, причем на каждом проходе над значениями цвета и прозрачности (color and alpha values) пиксела можно выполнять фиксированный набор операций. Пиксельные шейдеры дают гораздо большую гибкость, позволяя оперировать значениями цвета и прозрачности на собственном языке ассемблера (custom assembly language). Алгоритмы, реализованные на этапе обработки пикселов, включают наложение рельефа (bump mapping), затенение (shadowing), наложение карты среды (environment mapping) и т. д.
При обработке буфера кадра (frame buffer processing) используется набор регионов памяти, известных как поверхность рендеринга (render surface), буфер глубины (depth buffer) и буфер шаблонов (stencil buffer). На этом этапе выполняется серия вычислений для определения таких параметров, как глубина, прозрачность (alpha) и шаблон (stencil). Буфер глубины — это еще один метод оптимизации рендеринга, применяемый для удаления скрытых линий и поверхностей. Проверка глубины позволяет выяснить, какие пикселы скрыты и не нуждаются в рендеринге. При этом используется либо z-буфер, либо w-буфер (у каждого из них свои плюсы и минусы). Обработка буфера кадра дает возможность создавать ряд эффектов, в том числе прозрачность (transparency), туман (fog) и тени (shadows).
В конвейере Direct3D, — его поведение можно изменять через состояние графики (graphics state). Это состояние используется для настройки многих алгоритмов трансформации, освещения, растеризации, обработки пикселов и буфера кадра, предоставляемых Direct3D для рендеринга кадра. Оно включает состояния рендеринга (render state), трансформации (transformation state), сэмплера (sampler state) и наложения текстур (texture stage state) [5].
2.2 OpenGL
Сейчас трёхмерные изображения можно увидеть везде, начиная от компьютерных игр и заканчивая системами моделирования в реальном времени. Раньше, когда трёхмерная графика существовала только на суперкомпьютерах, не существовало единого стандарта в области графики. Все программы писались с "нуля" или с использованием накопленного опыта, но в каждой программе реализовывались свои методы для отображения графической информации. С приходом мощных процессоров и графических ускорителей трёхмерная графика стала реальностью для персональных компьютеров. Но в тоже время производители программного обеспечения столкнулись с серьёзной проблемой - это отсутствие каких-либо стандартов, которые позволяли писать программы, независимые от оборудования и операционной системы. Одним из первых таких стандартов, существующий и по сей день является OpenGL.
OpenGL - это графический стандарт в области компьютерной графики. На данный момент он является одним из самых популярных графических стандартов во всём мире. Ещё в 1982 г. в Стенфордском университете была разработана концепция графической машины, на основе которой фирма Silicon Graphics в своей рабочей станции Silicon IRIS реализовала конвейер рендеринга. Таким образом была разработана графическая библиотека IRIS GL. На основе библиотеки IRIS GL, в 1992 году был разработан и утверждён графический стандарт OpenGL. Разработчики OpenGL - это крупнейшие фирмы разработчики как оборудования так и программного обеспечения: Silicon Graphics, Inc., Microsoft, IBM Corporation, Sun Microsystems, Inc., Digital Equipment Corporation (DEC), Evans & Sutherland, Hewlett-Packard Corporation, Intel Corporation и Intergraph Corporation.
OpenGL переводится как Открытая Графическая Библиотека (Open Graphics Library), это означает, что OpenGL - это открытый и мобильный стандарт. Программы, написанные с помощью OpenGL можно переносить практически на любые платформы, получая при этом одинаковый результат, будь это графическая станция или суперкомпьютер. OpenGL освобождает программиста от написания программ для конкретного оборудования. Если устройство поддерживает какую-то функцию, то эта функция выполняется аппаратно, если нет, то библиотека выполняет её программно.
Что же представляет из себя OpenGL? С точки зрения программиста OpenGL - это программный интерфейс для графических устройств, таких как графические ускорители. Он включает в себя около 150 различных команд, с помощью которых программист может определять различные объекты и производить рендеринг. Говоря более простым языком, вы определяете объекты, задаёте их местоположение в трёхмерном пространстве, определяете другие параметры (поворот, масштаб, ...), задаёте свойства объектов (цвет, текстура, материал, ...), положение наблюдателя, а библиотека OpenGL позаботится о том чтобы отобразить всё это на экране. Поэтому можно сказать, что библиотека OpenGL является только воспроизводящей (Rendering), и занимается только отображением 3Д обьектов, она не работает с устройствами ввода (клавиатуры, мыши). Также она не поддерживает менеджер окон.
OpenGL имеет хорошо продуманную внутреннюю структуру и довольно простой процедурный интерфейс. Несмотря на это с помощью OpenGL можно создавать сложные и мощные программные комплексы, затрачивая при этом минимальное время по сравнению с другими графическими библиотеками.
В некоторых библиотеках OpenGL (например под X Windows) имеется возможность изображать результат не только на локальной машине, но также и по сети. Приложение, которое вырабатывает команды OpenGL называется клиентом, а приложение, которое получает эти команды и отображает результат - сервером. Таким образом можно строить очень мощные воспроизводящие комплексы на основе нескольких рабочих станций или серверов, соединённых сетью [6]. Что предоставляет библиотека в распоряжение программиста? Основные возможности:
1) геометрические и растровые примитивы. На основе геометрических и растровых примитивов строятся все объекты. Из геометрических примитивов библиотека предоставляет: точки, линии, полигоны. Из растровых: битовый массив(bitmap) и образ(image)
2) использование В-сплайнов. B-сплайны используются для рисования кривых по опорным точкам.
3) видовые и модельные преобразования. С помощью этих преобразований можно располагать обьекты в пространстве, вращать их, изменять форму, а также изменять положение камеры, из которой ведётся наблюдение.
4) работа с цветом. OpenGL предоставляет программисту возможность работы с цветом в режиме RGBA (красный-зелёный-синий-альфа) или, используя индексный режим, где цвет выбирается из палитры.
5) удаление невидимых линий и поверхностей. Z-буферизация.
Двойная буферизация. OpenGL предоставляет как одинарную, так и двойную буферизацию. Двойная буферизация используется для того, чтобы устранить мерцание при мультипликации, т.е. изображение каждого кадра сначала рисуется во втором (невидимом) буфере, а потом, когда кадр полностью нарисован, весь буфер отображается на экране.
6) наложение текстуры. Позволяет придавать объектам реалистичность. На объект, например шар, накладывается текстура(просто какое-то изображение), в результате чего наш объект теперь выглядит не просто как шар, а как разноцветный мячик.
7) сглаживание. Сглаживание позволяет скрыть ступенчатость, свойственную растровым дисплеям. Сглаживание изменяет интенсивность и цвет пикселей около линии, при этом линия смотрится на экране без всяких зигзагов.
8) освещение. Позволяет задавать источники света, их расположение, интенсивность, и т.д.
9) атмосферные эффекты. Например туман, дым. Всё это также позволяет придать объектам или сцене реалистичность, а также "почувствовать" глубину сцены.
10) прозрачность объектов.
2.3 Библиотека GDI+
GDI+ - это набор программных средств, которые используются в .NET.
GDI+ позволяют создателям приложений выводить данные на экран или на принтер без необходимости обеспечивать работу с определенными типами устройств отображения. Для отображения информации программисту достаточно вызывать нужные методы классов GDI+. При этом автоматически учитываются типы определенных устройств и выполняются вызовы соответствующих драйверов. Интерфейс GDI+ является развитием GDI (Graphic User Interace), использованного в ранних версиях Windows. Таким образом, модификация GDI для .NET называется GDI+.