Thursday, February 7, 2013

И пришел OpenGL. 

Скажу сразу, я ориентируюсь не на новичка в программировании. Как минимум, что такое динамическая диспетчеризация вы должны знать. Шучу! :) Не стоит бояться делать, что то новое. Дорогу осилит только идущий.

Ну что же, погнали

Под Java существует несколько дистрибутивов OpenGL, в частности: jogl, gl4java и lwjgl. Насколько я знаю lwjgl имеет довольно большое сообщество. Да и сам факт того, что например minecraft, spiral knights и прочие довольно успешные проекты реализованы с использование данной технологии, например для меня говорит многое.

Light weight java game library или просто lwjgl http://www.lwjgl.org/ - библиотека для языка программирования java, которая по сути из себя представляет объектную оболочку над OpenGL. Плюс набор классов для работы с оконной системой, контролерами.

Перейдем к делу. Я не буду дублировать информацию о том, как же подключить lwjgl к какой либо ide. Это задача довольно проста и на мой взгляд тот, кто не смог это сделать, не сможет самостоятельно двигаться в мире программирования. Тем более, что в вышеуказанной ссылке есть туториалы о том, как подключить эту библиотеку ко множеству сред разработки. Я представлю, что вы подключили библиотеку и начину непосредственно с создания базового программного кода. Создав проект в одной из ide (Eclipse, NetBeans или IDEA) создайте интерфейс:



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



- Метод cleanup будет "уничтожать" и высвобождать ресурсы  для отображения окна.
- Метод createWindow, как следует из названия будет средствами lwjgl создавать, инициализировать и параметризировать окно.
- Метод pollInput будет нашим handler"ом по "поимке" и обработке событий с клавиатуры, мыши и контроллеров.
- Метод initGL инициализирует конвейер состояний OpenGL (да, да, OpenGL это конечный автомат, ну об этом позже).
- Ну и метод run. Это то на чем следует сфокусироваться. Это то место, в котором, как в конвейере будут вызываться, создаваться и высвобождаться (я очень надеюсь, что сборщик мусора услышит меня) данные. Концепция в следующем: этот метод, вызывается каждый кадр, то есть это цикл который запускается с момента его вызова до того момента пока программа не будет завершена (ну или пока не вылетит exception :)). В англоязычной литературе OpenGL до версии 2.0 именуется как fixed function pipeline (фиксированный трубопровод). Да, до версии OpenGL 2.0 он был далеко не полностью программируемым мягко говоря, но с появлением шейдеров в этой самой версии 2.0, машина состояний OpenGL получила новое название - peogrammable pipeline (программируемый трубопровод). О шейдерах я начну чуть позже и скорее всего через пару десятков постов :) (нужен хороший background перед столь низко и одновременно высокоуровневым программированием комп графики). 
Давайте теперь реализуем наш интерфейс, и посмотрим что получиться на выходе:



Начнем с метода run. Пока что он ничего толком не делает. Просто крутиться себе трубопровод, пока вы не закроете программу и все. В инициализации окна (строчка 64) и машины состояний (строчка 65) вопросов возникнуть не должно, когда вы реализации всех методов увидите.

А теперь я вас попугаю чуть чуть:

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



На данном этапе нам интересней всего как же создать окно средствами lwjgl.
А все просто: для начала мы импортирует класс Display, который очень простой в использовании. Имея статическую сущность мы просто обращается через класс Display к методам.



Для высвобождения ресурсов я инкапсулировал метод destroy в свой метод.


Ну и последний метод, для получения статистической информации о системе. Пока что, просто примите на веру то, что написано тут. Позже, все станет шаг за шагом проясняться.

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

Всем спасибо.

Обо мне

Привет! Меня зовут Астемир, я инженер программист. Хотя, я больше программист чем инженер :). Мне нравиться ООП, компьютерная графика, разные алгоритмы ну и конечно структуры данных. Java как язык программирования я знаю лучше остальных, более 4х лет я программирую с использованием данной технологии. Но мои знания только этим не ограничиваются :). По ходу продвижения в java и openGL я включу в блог GLSL шейдеры. Ну и без математики ни куда не деться. Так что она тоже будет рассматриваться, но не с точки зрения математика я буду о ней рассказывать, а с точки зрения разработчика, т.е. нас будет в первую очередь волновать создание математических и по возможности обобщенных инструментов.