В нашем мире в средние века судьба старших братьев складывалась, как правило, куда счастливее, чем у родившихся позже, — все наследство доставалось им, младшим же приходилось прикладывать куда больше усилий для того, чтобы пробиться.
Среди современных компьютерных технологий судьба появившихся ранее далеко не всегда столь же безоблачна — скажем, первые оконные системы на Mac-ах востребованы не были, а сравнительно удачной оказалась вторая попытка, когда слово «Окна» стало названием даже еще не операционной системы, а оболочки Windows. В этой статье речь пойдет об еще одном не очень удачливом «старшем брате» — стандарте двух- и трехмерной графики OpenGL.
Немного истории
История OpenGL начинается в 1992 году. До выхода DirectX (точнее, его предшественника WinG) оставалось еще несколько лет. Новый стандарт был предложен компанией SGI, чье лидерство на рынке трехмерной графики в тот момент никто не оспаривал. Тогда же был основан консорциум ARB, который должен был решать дальнейшую судьбу нового API. В него вошла и Microsoft.
OpenAL: младший брат старшего брата
Существует аналогичный открытый стандарт для звука — OpenAL (www.openal.org), который примерно на 10 лет младше. В качестве альтернативы средствам из комплекта DirectX он никогда не позиционировался, и поэтому на слуху в гораздо меньшей степени. Но при написании этой статьи я сам с удивлением выяснил, что используется OpenAL достаточно широко — из проектов последних лет можно назвать хотя бы Doom 3, Quake 4 и S.T.A.L.K.E.R.. Как и в случае с OpenGL, при разработке кроссплатформенных приложений ориентироваться приходится именно на OpenAL.
Появление DirectX существенно изменило ситуацию — в 1997 году SGI и Microsoft попытались унифицировать API. Проект получил название Fahrenheit, но закончился полным провалом в 2000 году, когда успех GeForce и DirectX 7 позволил Microsoft больше ни на что не отвлекаться. Впрочем, руководитель этого проекта потом активно участвовал в разработке DirectX 10. А уже упомянутый консорциум Microsoft покинула в 2003 году.
Версия 2.0 появилась в 2004 году. Одна из ключевых возможностей этой версии — поддержка языка шейдеров GLSL, раньше они были доступны только как расширения. Последняя версия — 2.1 — вышла в августе 2006 года.
Версия 3.0 планировалась к выходу в сентябре этого года, но до конца октября так и не вышла, а новые сроки официально не названы. Впрочем, на сайте opengl.org с французской презентацией ознакомиться можно уже достаточно давно. В новой версии существенно пересмотрена объектная модель (страшно подумать, сколько раз это сделано в DirectX за это время!).
Консорциум же, определяющий направление развития OpenGL, успел много раз сменить состав, и сейчас в него входят AMD, Apple, Creative Labs, Intel, id Software, NVIDIA, Sony Computer Entertainment, Sun Microsystems и Texas Instruments.
Божий дар против яичницы
Сравнение OpenGL с DirectX, как ни крути, получается не вполне корректным.
DirectX — это не одна технология, а целое семейство, включая среди прочего и графику, которой, собственно, сфера приложения OpenGL и исчерпывается. Так что сравнивать OpenGL придется с Direct3D.
DirectX — технология, запертая в пределах одной группы операционных систем. Попытки энтузиастов — например, библиотека Wine, лучшее средство для запуска приложений, разработанных под Windows, на компьютерах с Linux — все-таки не в счет, хотя примеры из Microsoft DirectX SDK (и даже некоторые игры) таким образом действительно запускаются и работают с приемлемой скоростью. Но не надо забывать, что именно игры — все как одна опирающиеся на DirectX — одно из решающих на данный момент неоспоримых преимуществ Windows.
С другой стороны, если программа активно работает с графикой и почему-то нужно, чтобы она запускалась на нескольких платформах, — скорее всего, есть смысл использовать OpenGL. Да и при программировании под Windows не стоит забывать, что, скажем, инициализация OpenGL, в отличие от Direct3D, делается двумя-тремя строчками.
Надо отметить, что за 10 лет реального соревнования DirectX все-таки догнал OpenGL по удобству использования — Джон Кармак, призывавший в 1997 году Microsoft отказаться от поддержки DirectX, в январе 2007 высоко оценил удобство DirectX 9.0.
Но главное отличие OpenGL от DirectX — это механизм расширений. Расширения позволяют использовать новые возможности видеокарты до того, как они войдут в стандарт и будут поддержаны Microsoft в очередном выпуске DirectX. Иногда этот интервал составляет порядка года (как было, например, с Quake III Arena). На сайте OpenGL можно найти порядка 400 таких расширений.
Glide: проигравший младший брат
Те, кто активно играл в компьютерные игры уже во второй половине 1990-х годов, не могут не помнить взлет фирмы 3dfx — первый 3d-ускоритель Voodoo, который не был самостоятельной видеокартой и поддерживал исключительно видеорежим 640 на 480, и всю последующую линейку VooDoo. Дальнейшие успехи фирмы были далеко не столь впечатляющими, а кончилось это тем, что в 2002 году фирма NVidia купила к тому времени уже не основного конкурента. Но историю трехмерных ускорителей мы когда-нибудь прочитаем в разделе, посвященном «железу», а здесь поговорим о программной части.
Несовершенство тогдашней версии DirectX позволило (а может быть, вынудило) 3dfx представить собственный API для программирования трехмерной графики — Glide. Так как альтернатив на рынке не было, все игроделы вынуждены были использовать его. Glide API позволял выжать из карточки максимум возможного — и, естественно, это ничего не давало на видеокартах других производителей. Позже подоспели сначала новая версия DirectX и полноценные драйвера, еще позже — эмуляция Glide средствами DirectX, а еще позже Glide API окончательно утратил актуальность.
Отдельно стоит упомянуть MiniGL — драйвер для карт семейства Voodoo, который эффективно реализовывал аппаратное ускорение для подмножества OpenGL, использованного в Quake.
OpenGL в Windows
О реализации OpenGL в Windows стоит поговорить отдельно. Вплоть до появления Windows Vista драйвер OpenGL, входивший в состав Windows, не поддерживал аппаратного ускорения и не давал возможности использовать расширения OpenGL — таким образом, DirectX позволял использовать возможности видеокарт гораздо в большей степени. Это, впрочем, легко обходилось — драйвера видеокарт добавляли всю необходимую поддержку. Наиболее полной и удачной, на мой взгляд, она получалась у NVidia.
Появление Windows Vista существенно изменило ситуацию. Поддержка OpenGL в Vista возможна аж тремя способами.
Никуда не делась поддержка OpenGL через драйвера производителей. Недостаток — нельзя использовать Aera-интерфейс.
Есть реализация OpenGL через вызовы DirectX. В этом варианте мы ограничены версией 1.4 OpenGL API. Доступ к более новым возможностям — только через расширения.
Третий вариант наиболее удачный. Он не завязан на взаимодействие с рабочим столом и поддерживает возможности в пределах стандарта OpenGL версии 2.0.
Разноцветные книги
По традиции книги, посвященные OpenGL, издают в разноцветных обложках.
Самая важная — «красная книга» — выдержала уже 5 изданий. Как минимум 4-е из них переведено на русский язык. С этой книгой освоить программирование под OpenGL будет куда проще.
Синяя книга — подробное описание OpenGL API.
Вряд ли кому-нибудь из вас пригодится зеленая книга — она посвящена программированию под X Window System, один из стандартов интерфейса в Unix-системах. А вот «альфа-книга» (вот и не угадали, обложка у нее белая, а не прозрачная) посвящена программированию под Microsoft Windows.
На этом основные цвета заканчиваются, а книги — нет: оранжевая книга описывает язык шейдеров GLSL.
Много раз увидеть
Перейдем к картинкам. Прямого аналога DirectX SDK у OpenGL нет. А то, что доступно на странице www.opengl.org/sdk — скорее набор «сделай сам». Впрочем, он довольно универсален: там есть и примеры, и подробная документация, и программы для работы.
При написании этой статьи я использовал NVidia SDK — он содержит примерно половину примеров для OpenGL. Из него нетрудно понять, что в части трехмерной графики возможности обеих библиотек одинаковы.
Те, кто читают наш журнал достаточно давно, узнают изображение на заднем плане. Но тогда ему была посвящена заметная часть статьи. А на этот раз эта картинка иллюстрирует сжатие текстуры «на лету» при помощи пиксельных шейдеров. После того, как текстура сжата, ее можно не выпускать за пределы GPU. Ну, и, как всегда, мы можем любоваться сразу несколькими эффектами — блестящие поверхности излюбленного программистами чайника и, кажется, даже HDR.
Это картинка на знакомую нам тему HDR. Напомню вкратце, что HDR — способ преобразования цветов таким образом, чтобы сгладить несовершенство наших мониторов, которые не позволяют отобразить более чем 256 градаций цвета, тогда как в реальном мире глаз сталкивается с куда большими различиями яркости. Использованные в этом примере возможности — новые, появились только в видеокартах NVidia серий 8xxx (и аналогичных от ATI, разумеется). Это и оптимальный формат сжатия информации, и поддержка нескольких форматов HDR-изображений. А также обязательно обратите внимание на лучи, исходящие от ярких объектов — витражей и окон изображенного собора.
К сожалению, в момент написания статьи еще не вышли достаточно свежие драйвера, чтобы обработать следующий пример — построение классического фрактала, так называемой снежинки Коха. Поэтому честно предупреждаю: это не скриншот.
А интересен этот невзрачный на вид пример тем, что в один проход эта картинка не рисуется. Используется в этом примере специальное расширение от NVidia, позволяющее сделать произвольное количество итераций.
Очень красивая новогодняя елка. Затрудняюсь сказать, сколько источников света используется в этой картинке. В одном не сомневаюсь — видеокарты предыдущего поколения такую красоту в реальном времени не потянут. В NVidia, похоже, этим примером особенно гордятся — и даже документацию по нему вынесли в отдельный файл.
Нарисовать новогоднюю елку не так-то просто. Само дерево должно выглядеть естественно — но тут разработчики выбрали библиотеку SpeedTree (www.speedtree.com — посетите этот сайт, не пожалеете). Для веток превосходно подойдет фрактальный алгоритм. Кстати, это поможет и расположить украшения и лампочки гирлянд более-менее естественно. А теперь посмотрим на новогоднюю елку (а те, кто еще ее не поставил, пусть вспоминают прошлогоднюю): блестящие шарики, в которых отражается вся комната, матовые шарики, снежинки — прозрачные и непрозрачные... А еще ленты серпантина, орехи в фольге и уже упомянутые гирлянды. Авторы не поскупились — источников света несколько сотен, быстро просчитать такое освещение под силу далеко не каждой видеокарте. Тем убедительнее заявленные результаты — 150 FPS в режиме 800 на 600, правда, падающие до 20 в 1900 на 1200.
Разумеется, без достаточно хитрых приемов оптимизации тут не обошлось. Сначала рисуется собственно дерево. Потом приходит очередь украшений — все они имеют шарообразную форму и получаются с помощью геометрических шейдеров «раздуванием» из одной точки.
Все объекты всеми лампочками все-таки не освещаются: сцена разделена на отдельные участки. Но учитывается общая освещенность в каждой точке — эти данные сохраняются в отдельном буфере.
Потом для большей убедительности опять приходит очередь HDR — выделяются яркие точки-блики на украшениях.
Честно говоря, после этого примера ряд прочих вызвал у меня искреннее недоумение — кривая на белом фоне, пусть и разноцветная, пусть нарисованная с применением новейших технологий, выглядит все-таки не очень убедительно. Начальные обучающие примеры — типа каркаса чайника — тоже впечатления не производят.
Второй шанс?
Итак, сейчас OpenGL практически вытеснен из игр. Но уже появляются проекты эмуляции DirectX 10 через OpenGL. Да и на Vista стремятся перейти далеко не все. Кто знает — не ждет ли нас новое пришествие OpenGL в игрострой?
Фракталы
В этой статье я несколько раз упомянул фракталы. Пожалуй, будет не лишним подробнее рассказать, что это такое.
Я думаю, что многие читатели неоднократно видели фракталы на своих мониторах — фрактальные «хранители экрана» не редкость.
Название «фрактал» придумано Бенуа Мандельбротом, сотрудником IBM, в XX веке, хотя первые фракталы — например, так называемая кривая Пеано или канторова пыль — известны со второй половины XIX века. Корень названия — латинский, fractus, и означает он «поделенный на части». Одно из определений фрактала — фигура, которую можно порезать на части, и каждая из частей будет похожа на исходный объект. Классический природный фрактал — береговая линия: в каком масштабе ее ни изображай, будут заливы, мысы и острова. Другие примеры фракталов — снежинка, лист папоротника. Принцип остается прежним — детализацию можно продолжать сколь угодно долго, доращивая детали по одному и тому же алгоритму.
Более подробную статью о фракталах мы еще опубликуем, а напоследок — один из красивых фракталов, построенный на основе так называемого «множества Жюлиа»