Мир графических стандартов
Основы OpenGL
Дисплейный список и непосредственный вывод
Взаимодействие с оконными системами
Инструментальные средства OpenGL
Заключение
Литература

Разработчики прикладных систем, желающие быть уверенными в том, что их программы будут работать на нескольких аппаратных платформах, все большее внимание уделяют графическим стандартам. Последние годы ознаменовались широким распространением стандарта OpenGL как основного прикладного интерфейса для графических программ. Большинство производителей, среди которых DEC, IBM и SGI, реализуют OpenGL на своих станциях и серверах. Независимые фирмы-разработчики программного обеспечения осуществляют перенос OpenGL на платформы HP и SUN. Сфера применения данного промышленного стандарта не ограничивается только миром Х Window - OpenGL поддерживается сегодня в операционных системах OS/2 и Windows NT.

Мир графических стандартов

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

Для работы с двухмерными графическими приложениями большое распространение получил язык PostScript [1], значительно упростивший процесс обмена документами, содержащими текст и двухмерную графику. Система Х Window [2] становится стандартом для Unix-станций, позволяя не только одновременно выводить тексты и плоские изображения в окнах на графическом экране, но и обеспечивать ввод, не зависимый ни от компьютера, ни от типа дисплея.

При использовании средств трехмерной графики также применяется ряд стандартов, которые, однако, еще не столь популярны, как Х Window или PostScript. Среди них прежде всего можно сказать об известной системе PHIGS (Programmer's Hierarhical Interactive Graphics Systems), основанной на стандарте GKS [3]. PHIGS является стандартом ANSI и, так же, как и его расширение PHIGS+, позволяет создавать и манипулировать трехмерными объектами путем инкапсуляции их атрибутов и описаний в дисплейный список, используемый при визуализции. Создавать сложные объекты с помощью дисплейного списка можно только один раз, даже если они будут выводиться на экран многократно. Подобный подход усложняет процесс редактирования объекта в результате интерактивных действий пользователя. Другим недостатком является отсутствие поддержки таких важных сегодня элементов визуализации, как текстуры.

Система РЕХ [4] (которую можно охарактеризовать как расширение PHIGS на Х Window) дает возможность графическим приложениям, работающим под управлением Х, оперировать уже не с двух-, а с трехмерными графическими объектами. Для организации интерфейса между программами и протоколом РЕХ используется библиотека PEXlib[5]. Кроме прочих дополнений, в РЕХ был включен режим немедленной визуализации, позволяющий выводить объекты сразу после их описания, не дожидаясь завершения формирования дисплейного списка. Одна из основных проблем системы РЕХ - несогласованность ее реализаций, выпускаемых различными производителями. Это существенно затрудняет использование приложений на альтернативных аппаратных платформах. Кроме того, как следует даже из названия, РЕХ жестко привязана именно к Х Window и недоступна пока для пользователей, применяющих другие оконные пакеты.

Основы OpenGL

Несмотря на то, что OpenGL (Graphics Library) является относительно новым промышленным стандартом, по своим функциональным возможностям и интерфейсу он во многом аналогичен известной графической библиотеке IRIS GL. Подобно другим графическим системам, OpenGL предлагает интерфейс между программным обеспечением и аппаратурой. Данный интерфейс состоит из нескольких сотен процедур и функций, позволяющих программисту описывать трехмерные графические объекты и операции над ними. Так же, как и РЕХ, OpenGL интегрирует графические объекты в Х Window, но с таким же успехом может работать и с любой другой оконной системой или вовсе без нее.

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

Следует отметить, что стандарт отвечает только за визуализацию, осуществляемую через полностью независимый от производителя прикладной интерфейс пользователя, поэтому в нем нет средств описания структур сложных объектов. Главная цель OpenGL - задание механизма описания процесса. визуализации сложных объектов, а не способов их построения. Например, в стандарт не включены средства построения невыпуклых многоугольников, так как алгоритмы их визуализации намного сложнее, чем те, которые используются для выпуклых. Вследствие этого в альтернативных реализациях встречаются разные алгоритмы, поэтому эффективнее, особенно при многократном выводе невыпуклых многоугольников, предварительно разбить их на выпуклые (например, треугольники), что и делается в OpenGL. Специальные функции преобразования многоугольников, так же, как и другие полезные операции, например, интерфейс построения NURBS кривых и поверхностей, собраны в OpenG Utility Library. Данная библиотека - неотъемлемая часть системы визуализации в OpenGL.

Геометрические объекты в OpenGL формируются путем включения серии установок координат, векторов нормали и точек привязки текстур между командами glBegin и glEnd. Например, для построения треугольника с вершинами в точках (0,0,0), (0,1,0) и (1,0,1) можно написать следующую последовательность:

glBegin(GL POLYGON);
glVertex3i(0,0,0);
glVertex3i(0,1,0);
glVertex3i(1,0,1);
glEnd();

Предусмотрено десять различных геометрических объектов:

- point - последовательность точек;
- line strip - ломаная линия;
- line loop - замкнутая ломаная линия;
- separate line - отрезок линии;
- polygon - line loop, задающая границы выпуклого многоугольника;
- triangle strip - множество связных треугольников;
- triangle fan - множество треугольников, связанных наподобие веера;
- separate triangle - отдельный треугольник;
- quadriteral strip - связные четырехугольники;
- independent quard - отдельный четырехугольник.

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

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

Исходные координаты вершины подвергаются видовому преобразованию путем умножения на матрицу 4х4, содержащую операции сдвига, поворота и масштабирования. После загрузки в стек одной или нескольких матриц преобразования можно управлять последовательностью их умножения на координаты вершины объекта с помощью специальных команд. В OpenGL предусмотрена возможность проводить геометрические преобразования не только путем последовательных трансформаций вокруг осей Х, Y или Z, но и относительно произвольной оси, что по достоинству должны оценить все, кто когда-либо сталкивался с машинной графикой.

Цвет задается в модели RGB и Alpha, причем для задания тройки используется теперь не целые числа по 8 бит для каждого цвета, а нормализованное вещественное число от 0.0 до 1.0 (0% до 100%). Если необходимо учитывать освещенность, то текущий цвет объекта может подвергаться преобразованию в зависимости от следующих параметров: свойства материала, отражающие свойства поверхности объекта и параметры источника света. Изменяя параметры модели освещенности, управляя расположением источника, его мощностью, свойствами среды и т.д., можно получать самые разнообразные варианты картинки.

Команды OpenGL, которые не используются для описания вершин и ассоциируемой с ними информации, могут быть размещены и вне блока glBegin/glEnd, что позволяет выполнять приложения в оптимизированном режиме, используя максимально возможный для данного оборудования режим вывода примитивов.

При работе с текстами в OpenGL предусмотрена возможность преобразования шрифтов из Х Window или MS Windows непосредственно в свой буфер.

Обработка текстур является одним из наиболее мощных средств OpenGL, среди которых: управление временем выполнения преобразований для достижения требуемого качества изображения, автоматическое задание координат и трансформация текстур с помощью матрицы 4х4, привязка текстуры на поверхность произвольной формы. В конце вывода текстуры можно "напустить туману", используя функцию fog, применяемую к каждому фрагменту. Эффект размывания или тумана достигается путем включения в уравнение вычисления освещенности специальной переменной веса, зависящей от расстояния до наблюдателя. Использование экспоненциальной зависимости изменения этой переменной позволяет моделировать утренний туман либо легкую дымку, а линейная зависимость дает эффект уменьшения освещения при удалении от источника света, сравнимый с постепенным уменьшением света перед началом театрального представления.

Дисплейный список и непосредственный вывод

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

Несмотря на свою гибкость, режим непосредственного вывода может оказаться неэффективным, если требуется переопределить неизменяемые интерактивно объекты или параметры. В этом случае используется проверенный временем способ вывода через дисплейный список, содержащий последовательность команд OpenGL. Поименованный буфер памяти с дисплейным списком хранится на сервере, а его содержимое выводится на экран при поступлении команды glCallList, содержащей приказ от программы клиента. Данный механизм удобен в случае необходимости многократного выполнения группы команд, заключенных между скобками glBeginList/glEndList.

Взаимодействие с оконными системами

В основе модели интерпретации команд OpenGL лежит дисциплина клиент/сервер программа (клиент) выдает приказы OpenGL (сервер), который размещается на том же или на другом компьютере. На нижнем уровне команды OpenGL обрабатываются оконной системой, отвечающей за размещение ресурсов буфера кадра. Именно оконная система определяет, какая часть буфера может быть доступна для обработки программами, использующими OpenGL, и как осуществляется связь с этим буфером. Вывод содержимого буфера кадра на экран монитора также никак не зависит от OpenGL. Дополнительная независимость OpenGL от оконной системы достигается тем, что в OpenGL не предусмотрено средств ввода - предполагается, что такие средства уже имеются в оконной системе.

OpenGL регламентирует только процесс визуализации. Поэтому его можно интегрировать в любую доступную оконную систему - сегодня это Х Window System, NT и OS/2 - или работать вообще без таких систем. Специально для создания распределенных приложений предусмотрена подсистема GLX (расширение OpenGL на Х Window), позволяющая OpenGL-клиенту, работающему, скажем, на компьютере SGI Indigo, иметь прозрачный доступ к серверу IBM, на котором размещается ядро OpenGL. При этом в одном окне можно одновременно работать с функциями OpenGL, Х Window и Display PostScript.

Для визуализации примитивов OpenG требует наличия области в буфере кадра, которая в Х Window называется drawable ("то, что можно нарисовать"). Окно, представляющее собой один из типов drawable, ассоциируется с областью visual, где GLX хранит информацию о буферах OpenGL, не представленных в оконной системе Х Window Для того, чтобы интегрироваться в оконную систему, прикладная программа создает копию ядра OpenGL, ассоциированную с drawable областью, а затем инициализирует копию OpenGL визуализатора, расположенного на Х-сервере. Концептуально этот визуализатор является частью сервера и после создания может использоваться несколькими клиентами для выполнения команд OpenGL. Именно так происходит стыковка приложений на OpenGL и Х Window.

Если компьютер обладает достаточно развитыми графическим средствами, то можно избежать выполнения команд OpenGL. через Х-сервер. Такая возможность поддерживается системой GLX, но не является необходимой (клиент может определить текущую конфигурацию графической аппаратуры на предмет способности прямого выполнения команд).

Инструментальные средства OpenGL

Любой программист, впервые начинающий создавать приложения под Х Window, сталкивается с некоторой сложностью непосредственного программирования с использованием Xlib, поэтому были созданы специальные средства, облегчающие творческий процесс создания кода. Большую помощь могут оказать сегодня системы OpenLook, Motif и Tcl/Tk, однако, учитывая широкое распространение OpenGL, разработка приложений на ее основе с использованием, например, Motif или Xlib также может показаться затруднительной. В связи с этим для работы с OpenGL было предложено несколько инструментальных систем, облегчающих процесс программирования.

В отличие от более сложных интерфейсов типа Motif или Xlib, GLUT (OpenGL Utility Toolkit) требует для начала работы минимального числа установок. Аналогичным образом, интерфейс OpenLook, а именно XView, используемый для работы с Х Window, также был максимально упрощен, оставляя за кадром многочисленные очевидные установки. Если тексты программ присутствуют в поставке, то все программы на GLUT могут быть перекомпилированы для работы с NT или OS/2, а в версии для Х все программы GLUT свободно распространяются по Internet на сервере sgi.com.

Простая программа вывода изображения сферы на языке GLUT приведена на врезке.

Если требуется создать более чем одно окно, то в этой программе перед glutMainLoop() необходимо добавить последовательность:

glutCreateWin6ow("a second window");
glutDisplayFunc(display);
Организация ввода осуществляется в системе С LUT с помощью команд gkutkeyboardFunc()
- ввод с клавиатуры и glutMouseFunc() - работа с мышью. Для создания каскада меню
может быть использована следующая программа:
submenu glutCreatMenu(polygon_menu);
glutAddmenuEntry("Filled",1);
glutAddmenuEntry("Outline",2);
glutCreatMenu(main_menu);
glutAddmenuEntry("Quit",666);
glutAd6SubMenu("Polygon mode", submenu);
glutAttachMenu(GLUT_RIGHT_BUTTON);

Средства формирования меню ставят GLUT в один ряд с Motif и OpenLook, позволяя быстро создавать приложения, использующие возможности OpenGL без углубления в особенности работы Х Window или даже Motif.

Заключение

Система OpenGL является гибким процедурным интерфейсом, позволяющим программисту разрабатывать различные приложения с применением трехмерной графики. В стандарте нет регламентаций по описанию структуры графических объектов, главное внимание уделяется описанию процесса их визуализации. Благодаря этому возрастает эффективность работы имеющейся аппаратуры: от простых устройств, использующих только буфер кадра до современных графических систем, способных на аппаратном уровне визуализировать трехмерные объекты. В OpenGL предусмотрены только возможности по выводу изображений, организация ввода целиком отдана на откуп конкретной оконной системе, что позволяет достигать дополнительной аппаратной независимости приложений.

По причине минимального использования сложных структур для представления трехмерных объектов возможно применение OpenGL в качестве основы для построения библиотек управления структурированными объектами. Примерами таких библиотек могут быть объектно-ориентированные инструментальные пакеты, используемые для визуализации и моделирования сложных графических структур [6, 7].

С целью развития промышленного стандарта OpenGL была создана независимая организация Architecture Review Board (ARB), постоянными членами которой являются DEC, IBM, Intel, Evans й Sutherland, Intergraph, Microsof и SGI. В задачу ARB входит разработка предложений по дальнейшему развитию OpenGL, разбор замечаний, поступающих от пользователей, выработка спецификаций и тестирование новых версий. Постоянный состав может расширяться за счет независимых производителей программного обеспечения, вступающих в ARB на срок до одного года либо остающихся в организации постоянно. Это позволяет учитывать мнения независимых разработчиков программного обеспечения, которое может включаться в новые версии OpenGL. Для фирм, не являющихся членами ARB, существует возможность открыто влиять на развитие OpenGL путем участия в работе электронной телеконференции "opengl news group", установки прямых контактов с членами ARB или путем непосредственного выступления на ее форумах.


Литература

[1] Adobe Systems Inc. PostScript Language Reference Manual. Addison-Wesley, Reading, Mass., 1986.

[2] Adrian Nye. Х Window System User's Guide, volume 3of TheDefinitive Guides to the Х Window System. О'Reilly & Associates, Sebastopol, Са., 1987.

[3] International Standards Organization. International standard information processing systems - computer graphics - graphical kernel system for three dimensions (GKS-3D) functional description. Technical Report ISO Document Number 9905:1988(Е), American National Standards Institute, New York, 1988.

[4] Paula Womack, ed. PEX protocol specification and ecncoding, version 5.1Р. The Х Resource, Special Issue А, Мау 1992.

[5] Jeff Stevenson. PEXlib specification and С language binding, version 5. 1P. The X Resource, Special issue В, September 1992.

[6] Paul S.Strauss, R. Carey. An object-oriented 3D graphics toolkit. In Proceeding of SIGGRAPH'92, рр.341-349, 1992.

[7] G. Wiegand, B.Covey. HOOPS Reference Manual, Version 3.0. Ithaca Software, 1991.