DirectX и OpenGL

Автор: Юрий «yurembo» Язев
e-mail: yazevsoft@mail.ru

Ни для кого не секрет, что DirectX API – доминирующее средство для разработки игр под операционную систему Windows. В настоящее время 90% компьютерных игр для Windows пишутся под эту технологию. DirectX – это набор драйверов, служащий для работы программы напрямую с устройствами, минуя операционную систему, которая задерживает всю работу программы с оборудованием, используя неоптимальные механизмы и алгоритмы, и, осуществляя ненужные проверки. DirectX состоит из компонентов (модулей), каждый из которых предназначен для реализации определённой задачи: вывода двухмерной и трёхмерной графики, создания управления, воспроизведения звуков и музыки и т.д. Реализовав в программе возможности модулей DirectX, они создают интерфейс между программой-клиентом и драйвером устройства, поддерживающим DirectX. Благодаря этому, DirectX позволяет создавать быстрые мультимедийные приложения, в частности быстродействующие игры. Если в других приложениях (отличных от игр) быстродействия Windows хватает, то с играми ситуация иная. Для программиста использование возможностей библиотеки DirectX сводится к использованию высокоуровневых интерфейсов.

Стоит отметить, что DirectX – детище корпорации Microsoft, и поэтому эта библиотека реализована только под Windows – операционной системы разработанной и продвигаемой этой корпорацией. Первая версия DirectX появилась через незначительное время после выхода Windows 95 в том же 1995 году. Это событие ознаменовало новую эпоху в игростроении. Первая версия называлась Game SDK. Впоследствии Microsoft выпускает DirectX 2.0, DirectX 3.0 и т.д. DirectX бесплатен – всё в поддержку своей операционной системы! Вся библиотека DirectX разработана в соответствии со спецификацией COM – детищем Microsoft (здесь я не буду рассматривать эту технологию, так как это очень большая тема, достойная отдельной статьи, да и тема данного повествования иная (см. заголовок)). Так, программист захотевший использовать в своих программах возможности DirectX, должен сначала изучить COM, а потом уже углубляться в DirectX, потому что без знания основ COM невозможно программировать под DirectX. Ещё надо сказать, что DirectX SDK (заголовочные файлы DirectX нужные для программирования под DirectX) реализован только для компиляторов от Microsoft. Но существует проект JEDI – заголовочные файлы для работы с DirectX в Delphi. DirectX явился для Windows огромным подспорьем, способствующим в завоевание рынка программного обеспечения именно этой операционной системой. Microsoft развивает DirectX в соответствии с развитием информационно-компьютерных технологий и потребностями рынка программного обеспечения. Дальнейшее повествование будет заключаться в более подробном рассмотрении развития DirectX, начиная с седьмой версии по девятую. Microsoft выпустила DirectX 7.0 в 1999 году.

Выход этой версии означал большой прогресс, особенно в разработке трёхмерных игр. В седьмой версии два модуля библиотеки по выводу двухмерной и трехмерной графики существовали раздельно. Это модули DirectDraw (для двухмерной графики) и Direct3D (для трёхмерной графики). Оба компонента получили развитие по сравнению с шестой версией. Главными их задачами были и остаются быстрая обработка графики и стремительный её вывод на экран дисплея. За звук отвечали два компонента: DirectSound и DirectMusic. Кроме того, что эти модули ответственны за воспроизведения звука, так же они ответственны за правильную подачу звуковых данных на обработку звуковому адаптеру, и корректное их содержание (как не обработанных, так и прошедших обработку) в памяти машины. Разница между этими двумя модулями главным образом заключается в типах проигрываемых файлов. Хотя DirectMusic новей (впервые появился в шестой версии DirectX), программировать, используя его, значительно сложнее, чем с помощью DirectSound (первая версия которого появилась ещё в первой версии DirectX). За работу с устройствами ввода отвечал компонент DirectInput, обеспечивая прямую передачу данных и сообщений с таких устройств ввода, как клавиатура, мышь, джойстик и др. Для видео предназначен модуль DirectShow. Также, в конце 90-х перед разработчиками компьютерных игр, встала новая задача: геймеры требовали реализации игры по Сети (on-line), чтобы можно было сразиться со своим товарищем через Интернет в реальном времени. Microsoft не заставила себя долго ждать, и был разработан модуль DirectPlay, обеспечивающий многопользовательский режим игры в реальном времени. DirectPlay работает по своему собственному протоколу и является стандартом в игровой индустрии для реализации командных битв и других сетевых баталий. И последний компонент DirectX, имеющий всегда здесь место – это DirectSetup, предназначенный для инсталляции файлов DirectX, если они отсутствуют. Посмотрев на приведённую мной картину, можно уяснить предназначение каждого компонента библиотеки DirectX, и так же представить, как она мощна, и какой грандиозной надстройкой над операционной системой Windows она является.

Примерно через год, в 2000 году, корпорация Microsoft разработала DirectX 8.0. Каждая новая версия сохраняет все возможности предыдущих версий, но при этом привносит новые механизмы и новые возможности, иногда абсолютно отличающиеся от ранних решений (всё это благодаря COM). Таким образом, сохраняется совместимость с более ранними версиями и программами, написанными под них. Изменения, которые принесла новая версия, тоже можно назвать революционными. Два компонента для работы с графикой (DirectDraw и Direct3D) теперь были объединены и стали составлять модуль DirectXGraphics. Такое положение дел Microsoft объясняет тем, что оба модуля отвечают за графику. К тому же, по словам разработчиков из Microsoft, двухмерная графика уже никого не интересует, и поэтому изжила себя. И, как говорит всё та же всемогущая (и всё предопределившая) корпорация, двухмерная графика является частным случаем трёхмерной. Отдельно следует сказать, Microsoft пообещала, что в девятой версии библиотеки она продолжит развитие модуля DirectDraw. В дальнейшем повествовании (при рассмотрении DirectX 9.0) я расскажу, выполнила ли всеми любимая корпорация свои обещания. Продолжу обзор нововведений DirectX 8.0. Развитие модулей для работы с графикой не ограничилось только их объединением. Microsoft внесла много новшеств так же в Direct3D. Перечислю и рассмотрю некоторые из них. Например, появились вершинный и пиксельный шейдеры. Первый механизм (вершинный шейдер) обеспечил программистов гибкими и удобными путями в разработке поверхностей различной формы. Это достигается путём написания подпрограммы на языке, близком к ассемблеру для работы с данной памятью. Второй механизм (пиксельный шейдер) так же работает на низком уровне. Но пиксельный шейдер работает с пикселями, позволяя программисту построить поверхность любой детализации. При этом, используя все технологии Direct3D: раскрашивание вершин объекта в разные цвета, альфа-смешивание, цветовой ключ, текстурирование и др. Как и в прошлый раз, для использования пиксельного шейдера нужно написать программу на языке подобном. Этот механизм пригоден не только для получения поверхностей максимальной детализации, но и для повышения производительности программы. Появились (а некоторые улучшились) новые предопределённые флаги для работы с вершинными и текстурными координатами, были добавлены новые средства для оперирования матрицами и т. п. Также, был обновлён модуль DirectInput. На этом, думаю, можно закончить рассмотрение DirectX 8.0 и перейти к следующей девятой версии DirectX.

Microsoft реализовала DirectX 9.0 в 2003 году. На мой взгляд, изменения, привнесенные девятой версией, не стали такими уж неожиданными и революционными. Но всё же, я рассмотрю некоторые из них. Во-первых, об обещаниях Microsoft относительно совершенствования DirectDraw. Они не были исполнены, но в модуле DirectXGraphics были оставлены интерфейсы предыдущих версий. В основном разработчики из Microsoft внесли новшества в Direct3D. В новую версию DirectX был добавлен язык программирования HLSL (High Level Shading Language (Язык описания шейдеров высокого уровня)). С его помощью теперь можно описывать вершинные и пиксельные шейдеры на языке высокого уровня (подобному C), не прибегая к ассемблер -подобному языку низкого уровня. В результате, разработка шейдеров стала нагляднее, удобнее и проще. Также были переработаны механизмы работы с вершинами. Например, появился механизм индексации вершин. С его помощью построение трёхмерных объектов несколько упростилось. А главное, после добавления этого механизма, заметно сократилось количество вершин, необходимых для построения объектов. Соответственно,

памяти для построения объектов теперь нужно меньше. Ещё в этом модуле были улучшены многие другие механизмы: буфер глубины, освещение, материалы, мультитекстурирование, анимированные текстуры и др. Что касается, остальных компонентов DirectX, то они не претерпели больших изменений, а многие модули остались на уровне развития восьмой версии. Поэтому здесь я не буду их рассматривать. Лучше перейду к следующему разделу повествования.

В завершении этого рассказа о DirectX не могу не упомянуть о последней версии этой грандиозной библиотеке. 10 ноября 2006 года Microsoft выпустила DirectX 10. Новая версия поддерживается только в новой операционной системе Windows Vista. На этом я закончу разговор о DirectX и перейду к следующей теме.

Расскажу о другом средстве, использующемся при разработки компьютерных игр – OpenGL и проведу параллель сравнения между OpenGL и DirectX. Во-первых, OpenGL – это графическая библиотека, а DirectX – мультимедийная. Из этого следует, что OpenGL предназначена только для обработки и вывода графики на экран монитора, тогда как DirectX предназначена для обеспечения реализации полного контроля: обработки и вывода графики, воспроизведения музыки, работы с устройствами ввода и т.д. – о чём я рассказывал в предыдущих частях данного повествования. Первая версия OpenGL разработана корпорацией Silicon Graphics в 1992 году. OpenGL – это кросс-платформенная графическая библиотека, предназначенная для стремительной обработки и вывода графики на экран дисплея и реализованная во всех 32-разрядных операционных системах. В отличие от DirectX здесь нет разделения на модули двухмерной и трёхмерной графики. OpenGL работает только с трёхмерной графикой. Но это не значит, что под OpenGL нельзя писать двухмерные приложения. Можно, ещё как можно! В OpenGL реализована поддержка двухмерного измерения. Многие механизмы, реализованные (и рассмотренные мной выше) в Direct3D, имеются так же в OpenGL. Например: буфер глубины, освещение, материалы, текстурирование и мн. др. В OpenGL есть много оригинальных механизмов. Все новшества OpenGL по сравнению с DirectX (и не только) не перечислить в одной статье; и, не пытаясь это сделать, я приведу только несколько примеров. Например, набор примитивов – базовых объектов, с помощью которых осуществляется всё моделирование. В Direct3D их три: точка, отрезок и треугольник, а в OpenGL их гораздо больше. С помощью расширений библиотеки (я расскажу об этом чуть позже) к этому внушительному набору добавляются ещё объекты: как двухмерные, так и трёхмерные. Говоря об объектах, нельзя не сказать о кривых Безье, которые, так же подключаются посредством дополнительных модулей. В OpenGL ещё есть много другого не менее интересного. Все эти мощные возможности придают библиотеке OpenGL привлекательность для использования в любых приложениях (нас, конечно, больше интересуют игры), а так же устойчивую основу для дальнейшего развития! Теперь, я расскажу об ещё одном замечательном свойстве OpenGL. Правильнее сказать, это даже не свойство библиотеки, а изначально заложенный разработчиками способ распространения и развития. То есть разработчики из Silicon Graphics, видя перспективу развития своего детища, сделали его исходный код открытым. Это обстоятельство привело к появлению различных модификаций и надстроек, разработанных сторонними фирмами. Также, благодаря этому, появились реализации этой библиотеки под многие операционные системы (не Windows’ом единым(!)). Это свойство называется кросс-платформенностью. Так, программа, написанная под Windows с использованием функций OpenGL (без особых Windows-ухищрений), теоретически будет компилироваться в операционной системе Linux. Но, должен сказать, на практике всё выглядит намного сложнее: политика Microsoft (реализованная как в компиляторах, так и в операционной системе) не позволяет написать программу под чистый OpenGL. Поэтому, чтобы разработать действительно переносимую программу, нужно использовать надстройки. Но это всё-таки возможно! Что это даёт программисту, использующему OpenGL? Во-первых, освобождает от написания различного кода одной программы для разных операционных систем, экономя его драгоценное время, во—вторых, разрабатывая программу под OpenGL, программист уверен, что его программа будет одинаково функционировать на каждом отдельно взятом компьютере, потому что OpenGL – не отдельная программа, которую надо установить (как новую версию DirectX – к примеру), а часть операционной системы. Ещё есть много других интересных вещей, которые существуют благодаря кросс-платформенности, но их обсуждение выходит за запланированные рамки и всё это может иметь место в другой статье.

Видится широкое будущее OpenGL! Если принять во внимание тот факт, что в настоящее время OpenGL разрабатывается несколькими корпорациями, то это становится понятно. Silicon Graphics прекратила развитие OpenGL под платформу Win32, разрабатывая новые версии графической библиотеки только под свою платформу – мощные высокопроизводительные графические станции. Но, как я уже замечал, это не беда! Потому что, развитием этой библиотеки в настоящее время занимаются многие другие компании, например NVIDIA – крупнейший производитель видеоадаптеров и других устройств, так же занимающийся развитием OpenGL. NVIDIA привнесла в OpenGL много новшеств, которые реализованы в виде дополнительных библиотек и надстроек. Скажу пару слов о надстройках, благодаря которым, OpenGL стала действительно многофункциональной библиотекой. Так, в некоторых - реализован объектно-ориентированный подход к разработке программ с использованием OpenGL, в других реализована поддержка построения трёхмерных фигур (здесь следует заметить, что поддержка трёхмерных объектов реализована в OpenGL изначально, а надстройки служат для упрощения их построения). Есть надстройки, позволяющие более естественно настраивать перспективу обзора. Многие надстройки призваны облегчить жизнь программистам в работе с текстурами, моделями и другими объектами. Также, есть модули для работы с аудио информацией и устройствами ввода (подобно DirectX). В общем, надстройки это мощь, которых существуют великое множество и умение управлять ими, есть сила! Каждая новая версия, сохраняя возможности предыдущей, добавляет новые (заметьте, это всё-таки не COM). Поэтому программы, написанные для старых версий, будут работать и с новыми версиями библиотеки.

Стоит сказать пару слов об OpenGL для Linux. Там библиотека тоже развивается. Особенно хочется выделить фирму TrollTech, которая занимается развитием OpenGL. Так что, развитие OpenGL происходит очень динамично.



Опубликовал admin
13 Фев, Среда 2008г.



Программирование для чайников.