Наши партнеры

UnixForum






Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

На главную -> MyLDP -> Тематический каталог -> Графика, звук, видео в Linux

Что такое OpenGL?

Автор Miguel Angel Sepulveda

1998


Эта статья открывает серию монографий, посвещенных OpenGL и поддержки его Линуксом. Она предназначена программистам, желающим узнать, каким образом добавить высокопроизводительную 2D и 3D графику в свои приложения.

OpenGL, без сомнения, является превалирующим индустриальным программным интерфейсом (API) для разработки 2D и 3D-приложений. Его можно рассматривать как приемника библиотеки GL для Silicon Graphics IRIS, которая сделала весьма популярными рабочие станции SGI в качестве платформы для научных, инженерных работ, а так же для разработки спецэффектов. SGI вложила в OpenGL огромную долю своего опыта, чтобы сделать библиотеку простой в использовании, интуитивной, переносимой, сетевой библиотекой будущего. В то же время мы должны отдать должное пониманию SGI важности открытых стандартов. Сразу несколько производителей аппаратных и программных продуктов принимали участие в разработке стандарта. Благодаря этому, приложения OpenGL могут достаточно легко переноситься на практически любую платформу, присутствующую на сегодняшнем рынке, от персоналок с Windows95 до нашей великолепной Линукс-системы, от высокопроизводительных рабочих станций UNIX до суперкомпьютеров-маинфреймов. Спецификацию OpenGL рассматривает Architectural Review Board  (Совет по архитектуре), принимая или отвергая изменения, а так же предлагая тесты на совместимость.

В отличие от старой GL-библиотеки для IRIS фирмы SGI, OpenGL по своему дизайну является независимой от платформы и операционной системы. Библиотека является сетевой, позволяя выполнять приложение на сервере, а клиенту рендерить (отображать) графику. Специальный протокол передает команды OpenGL между сервером и клиентом. Благодаря независимости от ОС, сервер и клиент могут работать на разных платформах. Довольно часто сервером является суперкомпьютер, выполняющий сложное моделирование, а клиентом - простая рабочая станция, главным образом занятая визуализацией графики. OpenGL позволяет разработчикам писать приложения, которые могут легко раскладываться между многими платформами.

OpenGL, прежде всего, это оптимизированная, высокопроизводительная графическая библиотека для рендеринга, и есть множество графических карт с акселераторами и специализированных 3D карт, которые выполняют примитивы OpenGL на аппаратном уровне. До недавнего времени такие специализированные карты были, как правило, весьма дорогими, и доступными только для SGI-станций и других рабочих станций UNIX. Но все стремительно меняется, и, благодаря щедрой лицензии Silicon Graphics и ее же комплекту разработчика драйверов, мы видим все больше и больше аппаратуры для пользователей PC. Пользователи Линукс могут насладиться этой возможностью. Компания под названием 3Dfx Interactive представляет серию 3D графических карт и их поддержку под Линуксом через свою библиотеку Glide. Есть отдельная статья в рамках этой серии автора Phillip Ross (Графические карты 3Dfx) которая в деталях описывает доступные нам 3Dfx карты. Этот факт показывает изменение в отношении некоторых производителей оборудования, которые наконец осознали роль Линукса на рынке. Фанаты Линукса должны поддержать и поощрить такую инициативу.

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

В нашем цикле статей о программировании OpenGL мы будем использовать интерфейс для языка С применительно к OpenGL, как самый популярный. Однако читателю следует знать, что есть возможности использовать и другие языки с OpenGL: FORTRAN, C++, Ada и Java. Далее в нашей серии, после знакомства читателя с интерфейсом на языке С для OpenGL, мы скажем немного об Open-Inventor, библиотеке расширения OpenGL на языке C++.

Не вдаваясь глубоко в подробности, ниже приведены некоторые особенности, реализованные в OpenGL:

  • Геометрические примитивы позволяют конструировать математическое описание объекта. В настоящее время примитивами являются: точки, линии, многоугольники, изображения и битмапы (побитовые карты). 
  • Цветное кодирование в формате RGBA (Red-Green-Blue-Alpha) или в режиме индексированных цветов. 
  • Просмотр и моделирование позволяют размещать объекты на трехмерной сцене, передвигать камеры вокруг этого объекта и выбирать требуемую точку просмотра при рендеринге сцены. 
  • Текстуры помогают привнести реализм в модели при помощи рендеринга изображений реально выглядящих поверхностей поверх многоугольников модели. 
  • Освещение материалов - неотъемлемая часть всей трехмерной графики. OpenGL предоставляет в распоряжение команды для подсчета цвета любой точки при заданных свойствах материала и источников света в помещении. 
  • Двойная буферизация позволяет устранить мелькание при анимации. Каждое последующее изображение в анимационном ряду строится в отдельном буфере памяти и отображается только по завершении рендеринга. 
  • Anti-aliasing сглаживает неровные края линий, отображаемых на компьютерном дисплее. Ломанные линии часто появляются при низком графическом разрешении. Anti-aliasing является стандартной техникой в компьютерной графике и заключается в изменении цвета и интенсивности точек вблизи линии для уменьшения искусственных зигзагов. 
  • Gouraud тени - это техника применения сглаженных теней трехмерного объекта для достижения тонких различий цветов на некоторой поверхности. 
  • Z-буферизация отслеживает Z-координату трехмерного объекта. Z-буфер используется для определения приближения к объекту. Он так же является определяющим при удалении заслоненных поверхностей. 
  • Атмосферные эффекты, такие как туман, дым, дымка делают изображения, созданные компьютером, более реалистичными. Без атмосферных эффектов изображения зачастую выглядят нереально резкими и очерченными. Fog - это термин, который на самом деле описывает алгоритм моделирования тумана, дыма, загрязнений или просто эффект присутствия воздуха, придавая глубину изображению. 
  • Alpha смешивание использует значение Alpha (значение диффузии материала) как составляющую цветового кода RGBA, позволяя комбинировать цвет обрабатываемого фрагмента с цветом точек, которые уже хранятся в буфере. Представьте, например, отрисовку прозрачного голубого стекла перед красной коробкой. Alpha смешивание позволяет моделировать прозрачность стекла таким образом, что часть коробки, которая видна сквозь стекло будет иметь сиреневый оттенок. 
  • Трафаретные планы ограничивают отрисовку определенной областью экрана. 
  • Списки отображения позволяют сохранять команды отрисовки в некотором списке для дальнейшего рендеринга. При правильном применении, списки отображения могут заметно повысить производительность рендеринга. 
  • Полиномные вычисления дают возможность использовать неравномерные B- сплайны. Они помогают рисовать плавные кривые через несколько контрольных точек, исключая необходимость сохранять все промежуточные точки. 
  • Обратная связь, выделение и выбор дают вам возможность создавать приложения, которые позволяют пользователю выбирать область экрана или отдельный объект, изображенный на экране. Режим обратной связи позволяет разработчику получать результаты расчетов при рендеринге. 
  • Растровые примитивы (битмапы и прямоугольники из точек) 
  • Точечные операции 
  • Преобразования: повороты, масштабирование, трансляция, трехмерные перспективы и так далее.

Как мы уже отмечали ранее, для того, чтобы сделать OpenGL полностью переносимой и платформно-независимой, было необходимо пожертвовать всеми командами, которые имеют отношение к системе управления окнами, например - открыть окно, закрыть окно, изменить размеры окна, перерисовать окно, прочитать позицию курсора; пришлось пожертвовать и командами связанными с входными устройствами, например - чтения клавиатуры. Все эти операции очень сильно зависят от операционной системы. Поначалу библиотека GL имела свой набор команд для работы с окнами и периферией, но они были специфичны для IRIX (версия UNIX от компании SGI). Разработчик OpenGL должен знать свою платформу и позаботиться о работе с окнами на своей родной платформе. 

Благодаря Mark J. Kilgard из компании SGI, есть отдельная библиотека, которая призвана решить эту проблему. Mark написал библиотеку GLUT (от GL utility toolkit - набор утилит) которая заменила старую библиотеку AUX (нам сейчас неважно, что такое AUX, просто забудьте о ней!). Библиотека GLUT доступна бесплатно. Так же, как и в случае с OpenGL, вы можете найти и исходники, и откомпилированную версию для Linux. Библиотека GLUT является платформно-зависимой, и она предоставляет обычную парадигму для работы с окнами и переферийными устройствами. Таким образом, когда приложению OpenGL требуется открыть окно, оно использует набор команд GLUT, которая и позаботится о скрытой за ней оконной системе. Смысл заключается в том, что GLUT прячет от разработчика грязные детали конкретной оконной системы (X11, Виндовс, Motif и т.д.) и позволяет сосредоточиться на задаче - на коде OpenGL. Другое приятное преимущество использования GLUT заключается в том, что она делает ваш код независимым от платформы. Я самолично написал модели протеина и геля, которые используют GLUT и OpenGL, и мне удалось скомпилировать и без проблем запустить модели, не меняя ни строчки кода на Linux-Intel, Linux-Alpha, и Windows 95. (Признаюсь, я использую windows 95 временами ;-) Я настоятельно рекомендую всем, кто захочет написать приложение на OpenGL, использовать GLUT как обработчик окон.

Ясное понимание того, как использовать GLUT, столь же важно, как и знание самой OpenGL, поэтому в настоящую серию статей в LinuxFocus, посвященную OpenGL, мы включили несколько статей, которые шаг за шагом объяснят, как использовать GLUT для работы с периферийными устройствами.

В заключении этой короткой вводной статьи мы не можем не упомянуть другого "Владыку Вселенной," Brian Paul, который упорно и терпеливо создает библиотеку, совместимую с OpenGL для Linux под названием Mesa. В настоящее время, библиотека Mesa весь рендеринг производит программным образом, то есть процессор компьютера сам выполняет все задачи рендеринга, которые могли бы быть переданы на выполнение специализированному аппаратному обеспечению для 3D графики; однако Mesa содержит в себе возможность для написания и подключения драйверов такого оборудования. В настоящее время доступны драйвера для следующих наборов микросхем (чипсетов): Mondello, S3 Virge (только Win95), GLINT, и Voodoo 3Dfx. Благодаря драйверу Voodoo (написанному David Bucciarelli), Mesa достигает тех же уровней производительности, что и дорогие SGI станции, поэтому если вас интересует высокопроизводительная трехмерная графика, советуем вам купить 3Dfx карту.

Наконец, я не могу удержаться, чтобы не рассказать вам о личном опыте на своем Alpha-PC (21164 550MHz 164MRam Linux 2.0.32). Я использую библиотеку Mesa для написания программы моделирования геля. В моей системе нет аппаратной поддержки для библиотеки Mesa, потому что библиотека Glide (библиотека компании 3Dfx Interactive - Прим. Пер.) не перенесена на Alpha - процессоры (ПОТОРОПИТЕСЬ, ПОЖАЛУЙСТА!!!). Недавно Phil Ross и я сравнили производительности его Pentium PC + 3Dfx и моей Alpha PC + Matrox Millennium, и были немного удивлены тем, что моя программа анимации геля работала так же гладко на моем компьютере, как и на его. Демонстрационные программы OpenGL работали на моем компьютере даже быстрее (разумеется, только те, которые не использовали текстуры). Другими словами, недостаток аппаратной поддержки OpenGL компенсировался "грубой силой" процессора Alpha. Чтобы дать вам представление о работе, каждый кадр изображения модели структуры геля содержал десятки тысяч сфер и цилиндров, плюс все обсчеты света на них. На PC мы не могли наблюдать гель с таким количеством элементов, так как вычисления оказались слишком большими для бедного процессора Intel... С другой стороны, на процессоре Alpha все шло без проблем! Я не могу дождаться момента, когда увижу мою Alpha с картой 3Dfx и аппаратной поддержкой Mesa.

Перевод Vladas Lapinskas


Дальнейшая информация: