Выбор основного языка программирования и графической библиотеки для реализации программ компьютерной графики – Часть 2

История создания основных графических библиотек

Чтобы лучше понять, чего можно ждать от реализации обоих API, обратимся к истокам их создания. Обзор истории проливает свет на то, имеются ли какие-либо принципиальные различия между изначальной реализацией данных библиотек.

OpenGL

Данный API основан на стандарте IRIS GL, разработанном корпорацией Silicon Graphics Incorporated (SGI). Окончательно спецификация оформилась в 1992 году (30 июня был выпущен релиз версии 1.0). В OpenGL (Open Graphics Library – Открытая Графическая Библиотека) закладывалась идея создания аппаратно-независимого интерфейса, то есть единожды написанные программы могли бы без проблем работать на различных платформах. Долгое время развитием OpenGL занимался Architectural Review Board (ARB – Комитет Пересмотра Архитектуры), куда входят такие известные компании как 3D Labs, SGI, Apple, nVIDIA, ATi, Intel, id Software, Microsoft. Однако два года назад ввиду замедлившегося развития OpenGL и проблем с устаревшими стандартами дальнейшее развитие и выпуск нового стандарта OpenGL 3.0, поддерживающего все новейшие достижения компьютерной графике, был доверен промышленному консорциуму Khronos Group. Выпуск нового стандарта задерживался по всевозможным причинам и, в конце концов, произошел только на исходе 2008 года. До сих пор нельзя утверждать, что данный стандарт хоть сколько-нибудь прижился. Однако разработчики графического железа вышли из положения, создав extensions (расширения) для получения доступа к новым функциям.

Открытая Графическая Библиотека нашла свое применение во многих областях (не только игровой индустрии), и уже 18 лет остается востребованной.

DirectX

Данная библиотека является изобретением компании RenderMorphic, приобретенным Microsoft. Потребность в дополнительном графическом API возникла из-за изначальной ограниченности программирования игр под Windows 95 (а вернее, из-за медленной обработки мультимедийных данных). Поначалу Game Software Development Kit (Game SDK) позиционировался, как «идеальное решение для создания игр». Конечно же, DirectX 1.0 (впрочем, как и 2, и 3) не мог конкурировать с OpenGL, и поначалу это была медленная, сложная и обладавшая множеством недочетов и дисфункций библиотека. Продвижение DirectX началось с седьмой версии, когда реализация интерфейсов между программной и аппаратной частью стала быстрее и удобнее в программировании. Сейчас DirectX является достаточно мощной и стабильной (причем по большей части ее пишут программисты, работающие над Windows). Следует отметить, что исторически библиотеки решают одну и ту же задачу – упрощение программирования графики, причем в основу их разработки были положены одна и та же идея – реализация промежуточного слоя, способного воспринимать относительно простые программные команды и передавать их по стеку устройств и интерфейсов видеокарте. На настоящий момент обе библиотеки являются мощными разработками с равным потенциалом. Поэтому для определения различий более подробно рассмотрим принципы их работы.

Основные принципы работы графических библиотек

OpenGL

OpenGL с самого начала позиционировался исключительно как графическая библиотека. Основой для этой API является ядро, которое в состоянии обрабатывать примитивные объекты (как правило, треугольники). Программный интерфейс библиотеки содержит большое количество (порядка нескольких сотен) процедур и функций, необходимых для создания высококачественных графических изображений. Чтобы аппаратно реализовать многие сложные функции (например, antialiasing или texturing) от видеокарты требуется наличие framebuffer’а (кадровый буфер), причем некоторые операции могут выполняться исключительно в нем. Базовая схема реализации сложных операций показана далее на рисунке 2.

Рисунок 2. Общая схема работы графической библиотеки OpenGL.

На рисунке 1 показаны основные компоненты графической библиотеки OpenGL и их взаимодействие. Для работы с библиотекой программа сначала должна открыть окно во framebuffer (где будет происходить все операции), и потом уже контекст библиотеки связывается с этим окном. Такую операцию нужно проделать один раз, а далее все действия определяются через параметры обработки (рисование простых геометрических объектов: линии, точки, полигоны; рендеринг примитивов, включая их положение и цвет).

Для разработчика процессора видеокарты OpenGL является набором команд, которые влияют на работу графического железа. Если в наличии имеется только адресуемый framebuffer, то библиотека должна быть встроена в GPU. Чаще же плата содержит еще и графический ускоритель (состоящий из растровой подсистемы, которая занимается рендерингом 2D линий и полигонов). Графические процессоры способны лишь просчитывать и трансформировать геометрические данные (аналог элементарных операций, с которыми умеет работать обычный CPU – сложение и присваивание). Задачей создателя графической платы является разработка программного интерфейса GPU для разделения обработки команд OpenGL между GPU и остальным графическим железом. Такое деление должно быть специально оптимизировано под выполнение команд библиотеки.

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

Чуть выше были рассмотрены основные принципы работы библиотеки, далее будет рассмотрен простой пример – рисование текстурированной пирамиды средствами OpenGL. Для этого требуется базовые понятия, требующиеся для выполнения этой задачи:

  • Vertex (вершины) – образуются после указания координат в 2-х, 3-х или 4-мерном пространстве. В случае данного примера задаются четыре координаты в 3D пространстве, которые обозначают вершины фигуры.
  • Vertex Arrays (массив вершин) – для работы с множеством вершин требуется обрабатывать большое количество команд (для образования простых геометрических фигур), чтобы избежать ненужной вычислительной нагрузки существует объединение вершин. В данном случае из них образуется массив, который содержится в памяти. Для работы с пирамидой в целом вершины объединяются под единым именем.
  • Buffer Objects (буферные объекты) – если требуется сохранить данные (те же Vertex Arrays) в быстрой памяти видеоадаптера для последующего повторного использования, существуют Buffer Objects, которые осуществляют распределение, инициализацию и извлечение информации об объекте из памяти.
  • Evaluators – средства для множественных преобразования координат и цвета. После создания четырех вершин определяются команды для обработки (которые записываются в Display List) и проводятся усреднения и просчет геометрической поверхности (на этом шаге уже появляется каркас объекта).
  • Coordinate Transformation (трансформация координат) – все объекты перед выводом во framebuffer претерпевают изменение своих координат (из их программного представления в «оконное» для framebuffer), схема такого преобразования представлена на рисунке 2. Причем в этот момент происходит подготовка к растеризации (обрезаются лишние части фигуры, которые вылезают за экран).

Рисунок 3. Выполнение растеризации и интерполяции графической библиотекой OpenGL.

  • Rasterization – процесс, в котором вся картинка преобразовывается к 2D виду. Растеризатор обрабатывает объект, раскрашивает его, накладывает текстуру, и на выходе получается кадр, который далее поступает во framebuffer, а уже оттуда на монитор. То есть видно, что программист последовательно определяет только основные параметры для той или иной операции. Дальнейшее происходит без его участия, средствами библиотеки, драйвера и, наконец, видеоадаптера.
  • FrameBuffer (кадровый буфер) – некая область памяти для временного хранения информации о точках, составляющих один кадр изображения на мониторе. Открыть окно во framebuffer – это значит распределить видеопамять под изображение.

DirectX

Данный API является комплексной библиотекой, которая содержит в себе программные интерфейсы по обработке не только графики. В рамках данной работы рассматривается только графическую часть библиотеки.

Так же как и OpenGL, DirectX на низком уровне взаимодействует с аппаратной частью компьютера и предоставляет управляющей среде верхнего уровня набор интерфейсов для обработки графики, однако большим отличием от конкурента является использование Component Object Model (COM). То есть для работы с изображением нужно не просто вызвать определенную функцию или процедуру, а провести еще ряд дополнительных манипуляций для получения доступа к объектам (работа с которыми происходит только через интерфейсы), а после этого каждому объекту нужно заполнить некий набор необходимых свойств, без которых он является неопределенным. После компиляции программы команды на обработку графики для драйвера и видеокарты идут последовательно, вне зависимости от того, как было создано приложение.

Чтобы начать работать с графической библиотекой, требуется открыть окно программы, но далее нужно также создать устройство отрисовки и тем самым произвести инициализацию Direct3D. После выполнения этого шага идет процесс просчета и отображения сцены. Цепочка преобразований, необходимых для отображения некоторого объекта, показана на рисунке 3.

Рисунок 3. Пошаговое выполнение отображения объекта в графической библиотеке DirectX.

На аппаратном уровне API выполняется следующим образом: D3D обеспечивает независимость от Hardware Abstraction Layer (HAL – аппаратный уровень абстракции). HAL – это аппаратно-зависимый интерфейс, не поддерживающий эмуляции, который разрабатывается компанией-производителем видеоадаптера и включает в себя поддержку D3D. В данном случае Microsoft описала, как должна быть реализована D3D аппаратно, а уже компании-производители реализуют нужные функции в своих чипах. В результате складывается ситуация, при которой программа ничего не знает об установленном оборудовании и напрямую с ним не взаимодействует. Это имеет свои плюсы и свои минусы. Главный плюс – высокий уровень абстракции от оборудования, что является одной из самых желанных концепций, используемых в программировании вообще. А минус – может возникнуть потребность опроса видеокарты на предмет наличия поддержки графически сложных функций. В рамках данной работы таких функций выполнять не потребуется ввиду относительной простоты модели, поэтому наличие HAL дает только положительный эффект.

HAL может содержать три разных типа модели обработки вершин (на одном устройстве) – программный, аппаратный (который зависит от конкретного устройства) и смешанный. Аппаратный тип поддерживает только обработку вершин и дает возможность небольших изменений состояния устройства по запросу приложения. Кроме использования возможностей видеокарты, DirectX в полной мере пользуется инструкциями AMD 3DNow! и Intel Pentium SIMD (Simple Instruction Multiple Data, одна команда – много данных), которые включены в обработку некоторых вершинных шейдеров.

Для создания сцены потребуется инициализировать D3D объект для рисования, включая создание объекта, указание параметров отображения, создание D3D устройства, причем в параметрах устройства можно указать способ обработки вершин – аппаратный или программный. Далее производятся похожие с OpenGL преобразования, но с учетом того, что все операции работают над объектами. При завершении программы нужно закрыть устройство, но на деле этот процесс все же выглядит немного сложнее. В рамках данной работы не будут рассмотрены столь детальные подробности, поскольку завершение программы не влияет на впечатление пользователя от скорости и динамики отображения модели. Исходя их этого факта, можно достаточно либерально отнестись к корректности и быстроте завершения программы, тем более что в рамках managed-языков программирования это не так актуально.

Рисунок 4. Отображение фигуры по ее вершинам и соединениям между ними в графической библиотеке DirectX.

В новых версиях DirectX появились дополнительные возможности, увеличивающие реалистичность графики:

  • HLSL (High-Level Shader Language – Высокоуровневый Язык Шейдеров) – позволяет управлять потоком команд;
  • Контроль над выполнением шейдеров;
  • Взаимодействие с GDI (Graphics Device Interface);
  • Поддержка замещающих карт (Displacement mapping) – изменение координат полигона;
  • Поддержка 40-битного цвета (более 1.0 млрд. цветов).

Pixel Shaders – это небольшие подпрограммы (выполняются на графическом процессоре), которые работают с каждым пикселем при создании текстуры и применяются для просчета света, создания различных эффектов. В самой библиотеке OpenGL они отсутствуют по причине того, что, когда создавалась спецификация, шейдеры еще не были придуманы, и поэтому они были включены в виде расширений.

Реклама
Запись опубликована в рубрике Разные старые статьи. Добавьте в закладки постоянную ссылку.

4 комментария на «Выбор основного языка программирования и графической библиотеки для реализации программ компьютерной графики – Часть 2»

  1. ANTIMONOPOLIST:

    Architectural Review Board (ARB – Комитет Пересмотра Архитектуры), куда входят такие известные компании как 3D Labs, SGI, Apple, nVIDIA, ATi, Intel, id Software, Microsoft.
    Устроили манаполию открыли бы архитектуру КАРТы зачем нам ихнее «обстрагированние» Графика развивается со скоростью этих библеотек ЧТОЛИ

    отредактировано: убрана нецензурная лексика

    • Вообще часто железо развивается медленнее, чем библиотеки (например, NVidia очень долго не могли сделать DirectX11 карту).
      А «абстрагирование» действительно нужно, иначе пришлось бы писать машинный код под каждую видеокарту.

  2. Галина:

    Уже ищу самоучитель ДиректХ
    Хочется создать на экране нечто своё
    Респект за компетентный обзор

    • Спасибо, вот только обзор делался достаточно давно (и я даже не уверен, что он делался мной 🙂 ), ситуация несколько изменилась.
      Хотя я, в любом случае, предпочитаю DirectX.

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s