© Георгиевский Анатолий, 18.01.2008

Отображение графической информации средствами OpenGL

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

Задача статьи показать средства и методы визуализации трехмерных объектов в процессе численого моделирования на вычислительном кластере. Объем статьи не охватывает всех тонкостей задач визуализации, но предлагает ряд отправных точек для самостоятельного изучения предмета.

В предыдущей статье были рассмотрены особенности настройки програм для решения задач удаленого отображения графической информации на основе X-Window System. В статье было представлено решение одинаково успешно работающее на рабочих станциях под управлением GNU/Linux и Windows. В данной статье будет разобран ряд примеров позволящих создавать кросплатформенные приложения одинаково успешно работающие в среде Windows и Linux.

GTK+ графические библиотеки для создания пользовательского интефейса

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

  • Исходные коды программ должны быть доступны для компиляции под любую аппаратуру.
  • Программный интерфейс не должен зависеть от особенностей реализации под конкретную систему (Win32, GDI, X-Window, FrameBuffer и пр.)

Мы выделили библиотеки, которые оказываются отчень удобными при программировании на С/С++ и позволяют получить переносимый исходный код. Библиотеки называются GTK+ (Graphic Tool Kit). На основе этих библиотек строится графический интефейс для Linux, в частности Gnome. Существует порт под Windows, который развивается не менее активно, чем основной проект, позволяя не только переносить приложения из Linux в Windows, но и создавать кросс-платформенное переносимое программное обеспечение. Без дополнительных усилий со стороны разработчика приложения написанные c применением GTK+ могут быть скомпилированы для использования в системе Windows и Linux, причем результат будет выглядеть совершенно идентично.

Другим важным компонентом успеха является "правильный" выбор компилятора. Не секрет, что приложение скомпилированное разными компиляторами может вызывать или не вызывать ошибки. Конечно, хорошо отлаженное программное обеспечение не взовет ошибок компиляции. Чтобы избежать отдельной отладки приложения под Windows и GNU/Linux мы рекомендуем использовать компиляторы GCC, которые одинаково доступны под обе платформы. Использование компиляторов GCC практически исключает двойную отладку приложений. Если приложение скомпилировано GCC без ошибок под Linux, то оно непременно будет скомпилировано и под Windows.

OpenGL

OpenGL открытая спецификация графической библиотеки (Open Graphic Library). Спецификация описывает программный интерфейс для двумерной и трехмерной компьютерной графики. С 1992 г. OpenGL разрабатывались Silicon Grephics(SGI) для графических рабочих станций. Пограммный интерфейс OpenGL получил широкое распространение в задачах моделирования и инженерной графики. Позже с появлением графичечих ускорителей (видео-карт с аппаратной поддержкой трехмерной графики) интерфейс получил распространение в качестве основы для создания компьютерных видео-игр.

На сегодняшний день интерфейс OpenGL получил самое широкое распространения и поддерживается практически любой операционной системой. Производители видео-карт встраивают аппаратную поддержку интерфейса. Для платформ не обладающих поддержкой производителей может применятся программная реализация интерфейса, например mesa 3D.

Создание окна

Единственным узким местом создания переносимых приложений с интерфейсом OpenGL является интеграция с оконным графическим интерфейсом (Windows или X-window, "wgl" и "glx"), уровень интеграции является платформо зависимым. Иными словами, нужно сначала создать окно в оконном интерфейсе, потом привязать к нему интерфейс OpenGL, после чего ваше приложение может использовать полностью платформо независимый интерфейс OpenGL. Чтобы обойти этот уровень мы предлагаем использование библиотек GTK, которые реализуют платформо-независимый уровень интеграции OpenGL, GTK GL Extention. Примеры создания окон с интерфейсом OpenGL можно найти в дистрибудтиве GtkGlExt. Последовательность действий такова: открыть окно, создать область для рисования, и, наконец, привязать интерфейс OpenGL к области для рисования. В качестве альтернативы можно использовать кросс-платформенную библиотеку SDL, которая также как и GTK предоставляет платформо-независимый интерфейс для создания окон и обработки событий оконного интерфейса.

  • Подробнее Интеграция OpenGL средствами GTK
  • Подробнее Интеграция OpenGL средствами SDL

    Конвейер обработки команд

    Геометрические преобразования. Геометрические объекты можно задавать в любых удобных пользователю или разработчику координатах. Задачу пересчета координат можно переложить на аппаратуру. В OpenGL поддерживаются операции трансляции (параллельного переноса), поворота осей и масштабирования координат. При прочих равных лучше передать задачу пересчета координат, чем делать это в прикладной программе. Преобразования координат выполняются обратными (транспонированными матричными) преобразованиям. Что позволяет задавать геометрические объекты в удобных координатах, а так же позволяет уменьшить количество вводимых данных. Для наглядности, можно предствить, что имея только один примитив, прямоугольник на плоскости. Можно описать куб или поверхность, определяя как нужно повернуть и преобразовать каджую грань чтобы совместить её с примитивом. Последовательные преобразования координат пересчитываются в единую матрицу преобразования путем перемножения матриц, результат применяется при пересчете каждой вершины графического примитива.

  • Пример Отображение графиков cредствами OрenGL

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

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

    Модель расчета освещения включает один источник рассеяного света (AMBIENT) и несколько дифузных источников (DIFFUSE), для которых можно задавать цвет и местоположение (LIGHTn).

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

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

    Цвет. Модель освещенности может оказаться грамоздкой для задач инженерной графики. Во многих случаях удобно и наглядно бывает напрямую указывать цвет примитива, функцией Color. Цвет можно задавать отдельно для каждой вершины примитива. Например, при расчете полигона можно добиться градиентного перетекания цвета между вершинами, что, применительно к инженерной графике, бывает полезно для визуализации тепловых и силовых полей. Для реализации этой возможности можно отключить режим освещения (LIGHTING). Режим освещения действует локально и влияет на расчет только текущего примитива. Поэтому бывает удобно включать и выключать режимы освещения для получения необходимого эффекта. Цвет задается тремя или четырьмя компонентами. Три компоненты - красный-зеленый-синий, и четвертая компонента цвета, альфа-канал. Альфа-канал отвечает за прозрачность пикселя, может принимать значения между 0.0 и 1.0, 0.0- полностью прозрачно, 1.0- не прозрачно.

    Прозрачность. На самом деле OpenGL не предлагает просчитывать прозрачные объекты типа стекло, и уж тем более не создает оптических искажений, типа преломление света, это требует невероятно больших вычислительных ресурсов. Однако есть способ, как создать иллюзию прозрачности (ALPHA BLENDING). Всё сводится к выполнению математических действий на выходном буфере. Если в нашей сцене всё кроме стекла прорисовано, то стекло добавляется в последнюю очередь путем сложения цвета в каждой точке буфера и цвета нашего полупрозрачного объекта. Сложение производится с учетом прозрачности каждого пикселя. Прозрачность материала в каждой точке поверхности просчитывается с учетом четвертой компонентой цвета пикселя (альфа-каналом). Прозрачность (BLENDING) также используется при наложении текстур.

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

  • Подробнее Алгоритмы трехмерной графики и конвейер обработки команд

    Оптимизация графических программ в клиент-серверных приложениях

    Рассмотрим как работает приложение OpenGL в архитектуре вычислительного кластера. Некоторые расчеты, относящиеся к подготовке данных для ОpenGL, очевидно, выполняются на стороне кластера, но отображение трехмерных объектов осуществляется на удаленном терминале. Это означает, что со стороны приложения данные описывающие трехмерную сцену практически без изменения пакуются и отсылаются на Х-сервер. Х-сервер, установленный на удаленном терминале, используя аппаратные и программные возможности терминала, строит изображение. Кластер не занимается отображением, отображением занимается удаленный терминал. В связи с этим узким местом производительности графики может оказаться пропускная способность сети. Необходимо всеми возможными средствами минимизировать количество данных необходимых для описания каждой новой сцены.

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

    Идентификаторы текстур. Аналогичный механизм применяется для определения текстур. Текстура должна определятся один раз и жить в памяти видео-ускорителя, ей назначается номер и в дальнейшем пересылка текстуры от клиента к X-серверу не требуется, требуется лишь указание номера текстуры.

    Ну и, наконец, самое важное замечание. Процесс отображения графики не должен тормозить процесс расчетов. Поэтому, для выполнения расчетов запускается отдельная ветка (Thread) исполнения программы. Как правило, отображение данных в графическом виде часто происходит, гараздо медленне, чем генерация данных. При разработке программы, возможно, следует учесть это и отображать далеко не все данные и с частотой доступной для человеческого восприятия. Отображение графики в программах c MPI следует производить только с одного выделенного вычислительного узла.

    Ссылки

  • OpenGL - индустриальный стандарт трехмерной графики
  • Спецификация OpenGL. Не самая свежая, но рекомендуемая для начального ознакомления.
  • GTK+ для Windows
  • Gtk GL Extention - Поддержка OpenGL в GTK+
  • SDL - Simple DirectMedia Layer, кросс-платформенная библиотека мультимедия, предоставляет интерфейс к OpenGL
  • X-Window System

    ()

  •