Научная работа: Разработка подсистемы визуализации моделей и их модификации
Поскольку некоторые графические платы поддерживают не все функции, доступные через Direct3D, предусмотрен механизм проверки возможностей аппаратного обеспечения. Если данная функция не поддерживается аппаратно, проверка заканчивается неудачей, что позволяет программисту переключиться на другой алгоритм с аппаратным ускорением. Главное — помнить, что Direct3D-конвейер стандартных функций предоставляет доступ к аппаратной функциональности. Хотя в Direct3D есть режим чисто программной эмуляции (software-only emulation mode), также называемый эталонным устройством (reference device), он предназначен только для отладки и тестирования.
Другой, более интересный подход к проблеме параллельной эволюции аппаратного и программного обеспечения — применение программируемого конвейера. В этом случае вместо выбора предопределенного перечислимого значения и запроса к Direct3D на выполнение соответствующего алгоритма программист определяет собственный алгоритм. Исполняющая среда Direct3D динамически компилирует этот алгоритм для нижележащего аппаратного обеспечения, взаимодействуя с JIT-компилятором, который является частью драйвера устройства. За создание JIT-компиляторов для конкретных графических устройств отвечают поставщики оборудования. Таким образом, Direct3D выступает в роли графической виртуальной машины (graphics virtual machine), которая фактически виртуализирует графический процессор (GPU) на основе пользовательского набора команд для графических операций.
Хотя оба программных уровня Direct3D (управляемый и неуправляемый) предоставляются через группы объектов, не следует считать их инфраструктурой программирования прикладного уровня. Основная роль архитектуры Direct3D — обеспечить доступ к базовой функциональности решениям более высокого уровня, например API игровых движков. Чтобы упростить реализацию таких решений, библиотека расширений Direct3D (Direct3D extension library) явным образом предоставляет дополнительную функциональность. Для лучшего понимания архитектуры Direct3D вы должны разобраться не только в абстрагируемой функциональности, но и в том, как эта функциональность структурирована и как к ней обращаться. В нескольких следующих разделах мы дадим обзор основных элементов архитектуры Direct3D и обсудим, каким образом организован доступ к ним из неуправляемого COM API и управляемого уровня абстракции .NET. Как это нередко бывает в архитектурах компьютерного аппаратного обеспечения, в архитектурах аппаратного ускорения трехмерной графики применяются два способа оптимизации: конвейеризация (pipelining) и параллелизация (parallelizing). Алгоритмы, доступные через Direct3D, логически организованы в конвейер.
Конвейер Direct3D следует рассматривать как набор алгоритмов, выполняющих операции над трехмерными геометрическими величинами (3D geometric quantities), каковыми в случае Direct3D являются предопределенные вершины (vertices) и примитивы (primitives). Основное предназначение конвейера — преобразование геометрических данных в изображение, формируемое на экране. Этап тесселяции в Direct3D — разбиение на треугольники фиксированного набора предопределенных примитивов более высокого порядка, в том числе треугольных (triangle patches), прямоугольных (rectangle patches) и полигональных участков поверхностей (N patches) (хотя треугольные участки поверхности остаются наиболее распространенной формой). В настоящее время этап тесселяции нельзя программировать, поэтому Direct3D не предоставляет никаких механизмов для генерации геометрических данных на основе программируемых процедур. А такая возможность позволила бы резко уменьшить объемы данных, пересылаемых по шине. Аппаратная поддержка программирования этапа тесселяции, видимо, появится в ближайшем будущем [4].
Этап трансформаций и освещения (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.