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

Объяснение термина
Под двумя последними буквами в понятии OpenGL скрывается Graphics Library. Полностью оно переводится как «отрытая графическая библиотека». Почему открытая? Потому что разработанные на ней продукты можно открывать на любых платформах и результат будет один и тот же. Это может быть как графическая станция, так и суперкомпьютер.
По своей сути OpenGL является интерфейсом, использующим двухмерную и трехмерную графику. Это спецификация, то есть документ с набором функций (API). Основываясь на ней, производители оборудования создают реализации. Если оно не может реализовать какую-либо команду, она эмулируется программами.
Получается, что разработчикам программного обеспечения достаточно научиться использовать возможности Опенгл, а их практическое осуществление отводится изготовителям аппаратной части.
Существуют реализации интерфейса для Windows, Unix-платформ, PlayStation 3 и Mac OS, которые предоставляются производителями видеокарт для возможности работы с ними. Но есть и открытая реализация для других графических карт — библиотека Mesa, которая хоть и считается неофициальной, но отлично справляется со своими задачами.
Появление
В 1990-е годы выпускать кроссплатформенное ПО было дорого и сложно, поэтому создавались отдельные технологии для каждого вида видеокарт, вследствие чего множился один и тот же программный код. Естественно, это преграждало путь совершенствованию компьютерной графики.
В те годы компания Silicon Graphics (SGI), выпускающая высокотехнологическую графическую аппаратуру и проги, занимала лидирующие позиции в трехмерной графике. Поэтому взяла на себя ответственность в стандартизации доступа к соответствующему оборудованию на уровне программного интерфейса.

Таким образом, в 1992 году появилась первая OpenGL. Последнее ее обновление произошло в 2017 году до версии 4.6.
Основные функции
В интерфейс включено больше 300 функций, с помощью которых можно рисовать из простейших примитивов сложные трехмерные сцены. Эти инструменты применяются в создании компьютерных игр, мультфильмов, виртуальной реальности, моделировании, научных исследованиях и пр.
Несколько стандартных возможностей спецификации:
- Применение В-сплайнов, необходимых для проведения кривых по опорным точкам;
- Геометрические и растровые примитивы, из которых делаются любые объекты;
- Управление цветами в режиме RGBA, или выбирая оттенки из палитры;
- Модельная и видовая оптимизация для перемещения объекта в трехмерном пространстве;
- Одинарная, двойная (для устранения мерцания в анимации) и тройная буферизация которая в сравнении со второй быстрее выводит изображение;
- Стирание невидимых линий и поверхностей;
- Придание объектам текстуры, чтобы они выглядели реалистично;
- Сглаживание линий путем изменения яркости и цвета пикселей возле них;
- Расстановка и контроль источников света;
- Добавление таких эффектов как туман, дым и пр.

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

Дело в том, что спецификация призвана лишь отображать заданные вами команды. Управлять итоговой картинкой клавиатурой и мышью не получится. Также нет поддержки менеджера окон. Но это касается только стандартной библиотеки. Есть и другие — с расширенным функционалом.
Что такое opengl вспомогательные библиотеки
Широко используются 4 дополнительные библиотеки:
- GLU. Она уже считается стандартом в работе с компьютерной графикой, поэтому поставляется в комплекте с OpenGL. Первая построена поверх второй, поэтому использует ее функции, только в упрощенной, но в то же время совершенной форме, а также может выполнять и более сложные задачи.
GLUT. Функционирует на различных операционках. Эта библиотека пригодиться вам, если захотите работать с окнами и устройствами ввода-вывода. Еще она позволяет распознавать такие непростые объекты как тетраэдры, конусы и даже, к примеру, чайники, всего одной командой.
- GLAUX. Менее производительный аналог предыдущего варианта, созданный компанией Microsoft специально для работы в ОС Windows.
- GLX. Еще одно расширение для Виндовс, предоставляющее как локальный, так и сетевой рендеринг.
Сравнение с Direct3D
Основным конкурентом OpenGL выступает Direct3D — продукт фирмы Майкрософт, созданный специально для написания компьютерных игр. На вопрос «что лучше» сложно ответить, потому что обе имеют свои преимущества.
Все-таки приведу некоторое сравнение, чтобы вы сами могли сделать вывод, какая спецификация больше подойдет для ваших задач:
- Direct3D работает только на платформах Intel и ОС Windows, а OpenGL успешно открывается не только на этой системе, но и на Unix, Linux, MacOS, IRIX, SunOS и пр.
- Однако опенгл принимают не все графические карты, а директ лишен такого недостатка;
- Также последний отличается лучшим объектно-ориентированного подходом.
- Правда, кроссплатформенная спецификация проще к пониманию, поэтому новичкам для обучения основам трехмерной графики лучше выбирать ее.

На этом всё что касается того, что такое opengl.
Не забудьте поделиться этой статьей со своими знакомыми, которые тоже увлекаются компьютерной графикой.
OpenGL: Основы.
OpenGL является одним из ведущих и популярных графических API, разработанный SGI. OpenGL разрабатывался как многоплатформенный, открытый и быстрый графический API. Многие графические пакеты используют OpenGL для вывода трёхмерной графики. Многие известные игры, такие как Quake, Serious Sam и наш отечественный ИЛ-2 Штурмовик, также написаны под OpenGL.
Введение
Почти все современные графические акселераторы могут аппаратно поддерживать OpenGL, что позволяет выводить графику в реальном времени.
В этом уроке мы познакомимся с основами OpenGL, и научимся делать приложения, работающие с этой графической библиотекой в операционной среде Windows. (О том, как создать проект и написать пустой код выполняемого приложения, можно узнать здесь.)
OpenGL представляет собой набор функций, при помощи которых можно выводить 2-х и 3-х мерные графические примитивы, управлять ими, их свойствами, способами вывода и пр.
Заголовочные файлы, которые могут понадобиться для работы с OpenGL, обычно находятся в папке GL, расположенной в стандартной папке Include.
Объявление стандартных функций OpenGL находится в файле gl.h, поэтому ваш файл исходного кода, содержащий функции OpenGL, должен включать gl.h:
Кроме того, линковщику нужно указать статические библиотеки, с внешними функциями. Например, для функций, объявленных в gl.h, необходимо добавить в проект opengl32.lib.
Инициализация
В OpenGL нет встроенных функций для инициализации OpenGL. Это связано с тем, что OpenGL является независимым от платформы графическим API. Инициализацию обеспечивает операционная среда.
Существует несколько функций по работе с OpenGL, которые представляет Windows API.
Перед тем как проинициализировать наше приложение, мы должны определить какими свойствами будет обладать наше приложение и каким способом будет выводиться графика.
Обычно в трёхмерных играх каждый видимый кадр строится заново. То есть, в каждом кадре полностью перерисовывается вся видимая графика. Построение кадра может происходить следующим образом. Сначала весь кадр очищается, а потом последовательно выводятся трёхмерные графические объекты. Такое действие происходит несколько раз в секунду. Количество этих перерисовок в секунду называют FPS (frames per second).
Понятно, что если мы будем стирать и рисовать в видимой части экрана, то мы будем видеть мигание и мерцание наших рисующихся и стирающихся объектов.
Чтобы не было этого неприятного эффекта, пользуются следующим способом. Весь кадр полностью строят в невидимой части видеопамяти адаптера. Эту часть называют Back Buffer. После того, как все графические объекты выведены, вся эта невидимая часть копируется в видимую область видеопамяти, называемую Front Buffer. Если ваше приложение выводит графику на весь экран, а не в окно, то можно избежать копирования буфера, переключая указатель на видимую часть в видео памяти. Такой эффект называют Flip. Видно, что он работает быстрее, чем копирование буфера.
Мы будем строить пример оконного приложения.
Окно, в котором будет выводиться графика под OpenGL должно иметь два дополнительных стиля WS_CLIPSIBLINGS и WS_CLIPCHILDREN. Эти стили можно установить либо во время создания окна в функции CreateWindow(), либо функцией из Windows API — SetWindowLong(), если окно уже создано.
Согласно нашему примеру, для того чтобы установить эти стили, нами созданную функцию CreateMainWindow() необходимо вызвать с true в параметре bIsOpenGL.
Для устройства контекста окна необходимо выставить описатель пиксельного формата.
Это можно сделать при помощи объекта структуры PIXELFORMATDESCRIPTOR. Тут вы указываете, например, сколько бит необходимо выделить под каждое значение цвета, под буфер глубины и т.д.
Рассмотрим функции, работающие с PIXELFORMATDESCRIPTOR.
На самом деле, вы не всегда можете установить точно все параметры PIXELFORMATDESCRIPTOR для текущего режима по вашему желанию. Другими словами, вы можете рекомендовать те или иные параметры, система, выберет наиболее подходящий формат по вашим пожеланиям.
Итак, сначала создадим объект типа PIXELFORMATDESCRIPTOR, полностью заполненный нулевыми значениями.
Для работы с этим объектов всегда нужно выставлять поля nSize значением равным размеру всей структуры и nVersion (версия) — со значением равным 1.
Также необходимо выставить требуемые флаги в dwFlags. Поскольку мы собираемся выводить графические объекты в окно, то нужно выставить флаг PFD_DRAW_TO_WINDOW. Далее, говорим, что буфер кадра поддерживает вывод через OpenGL — PFD_SUPPORT_OPENGL, и, так как мы используем два буфера (Back и Front), устанавливаем флаг PFD_DOUBLEBUFFER. Итак:
В поле iPixelType выставим PFD_TYPE_RGBA. Это означает, что цвет для пикселя представляется в виде RGBA (цветовые компоненты: R — красный, G — зелёный, B — голубой и A — альфа). Кроме этого бывает ещё индексное представление, которое мы не будем рассматривать вообще.
Дальше выставляем желаемые параметры. Например: глубину цвета (cColorBits) — 32 бит.
Заполнив все необходимы поля, мы делаем запрос на выбор самого подходящего формата. Это делается функцией ChoosePixelFormat(). Эта функция либо возвращает подобранный для указанного контекста устройства индекс формата, либо возвращает ноль.
Если формат был успешно подобран, нужно его выставить функцией SetPixelFormat().
Чтобы узнать, какие именно значения устанавливаются для формата, то есть получить описание полей структуры PIXELFORMATDESCRIPTOR, пользуются функцией DescribePixelFormat()
Итак, построим функцию, инициализирующую пиксельный формат для устройства контекста:
Если удалось установить пиксельный формат, то теперь нужно создать просчитывающий контекст (rendering context) OpenGL. Это делается вызовом функции wglCreateContext(). Далее, созданный контекст выставляется текущим функцией wglMakeCurrent().
Теперь вы можете пользоваться функциями OpenGL.
По окончанию работы с OpenGL, например, в конце работы приложения, нужно освободить занятые ресурсы: освободить контекст, вызвав wglMakeCurrent() с параметром ноль для идентификатора контекста OpenGL и разрушить этот контекст функцией wglDeleteContext().
Итак, мы теперь можем построить код, позволяющий работать нам с OpenGL:
Кроме того, если вы пользуетесь кодом для своего приложения, описанным здесь, то не забудьте добавить в него:
Немного Об OpenGL
Как известно, OpenGL расшифровывается как Open Graphics Library, что в переводе на русский язык означает «открытая графическая библиотека».
Другими словами, OpenGL — это некая спецификация, включающая в себя несколько сотен функций. Она определяет независимый от языка программирования кросс-платформенный программный интерфейс, с помощью которого программист может создавать приложения, использующие двухмерную и трехмерную компьютерную графику. Первая базовая версия OpenGL появилась в 1992 году – она была разработана компанией Silicon Graphics Inc., занимающейся разработками в области трехмерной компьютерной графики.
За следующие 17 лет версия библиотеки достигла отметки 3.1. Но нельзя сказать, что библиотека видоизменялась, нет. Ее создатели заложили в нее механизм расширений, благодаря которому производители аппаратного обеспечения (к примеру, производители видеокарт) могли выпускать расширения OpenGL для поддержки новых специфических возможностей, не включенных в текущую версию библиотеки. Благодаря этому, программисты могли сразу использовать эти новые возможности, в то время как в случае использования библиотеки Microsoft Direct3D им бы пришлось ждать выхода новой версии DirectX.
В современном мире, библиотеки OpenGL и DirectX являются конкурентами на платформе MS Windows. Microsoft всеми силами продвигает свою библиотеку DirectX, а также всеми силами стремится замедлить развитие библиотеки OpenGL, что ослабило бы графическую систему конкурирующих ОС, где для реализации вывода всей графики используется исключительно библиотека OpenGL. Мы будем учиться визуализации компьютерной графики именно с применением этой библиотеки. Но, к сожалению, прямой поддержки данной библиотеки в .NET Framework нет, опять же по причинам конкуренции. Поэтому мы будем использовать библиотеку Tao Framework, о которой поговорим в следующей части главы.
Пара слов об OpenGL 4
11 марта 2010 года Khronos Group на GDC объявила о выпуске спецификации OpenGL 4.0:
Рисунок 1. OpenGL 4.0
Эволюция OpenGL 1 — 4
Эта новая версия продолжает стремительное развитие свободного стандарта OpenGL, для того чтобы графические разработчики имели доступ ко всей функциональности современных GPU для использования в самых разнообразных операционных системах и платформах. Полная спецификация доступна для скачивания на http://www.opengl.org/registry.
OpenGL 4.0 улучшает тесные взаимодействия с OpenCL™ для ускорения вычислительных ресурсов графических приложений. OpenGL 4.0 также продолжает оказывать поддержку совместимости с OpenGL 3.2, что позволяет разработчикам использовать упрощенный API или сохранить обратную совместимость для существующего кода OpenGL в зависимости от потребностей рынка.
Основные изменения
- 2 новых уровня шейдеров, которые обрабатываются в GPU для разгрузки CPU при выполнении тессиляции;
- поддержка выборочных фрагментных шейдеров и программируемых фрагментных шейдеров для увеличения качества рендеринга и гибкости при реализации сглаживания;
- отрисовка данных, полученных в OpenGL или через внешние интерфейсы, таких как OpenCL, без вмешательства центрального процессора;
- шейдерные подпрограммы для значительного увеличения гибкости программирования;
- разделение состояния текстур и текстурных данных за счет добавления нового типа объекта данных – «объекты семплов»;
- 64-битная двойная точность шейдерных операций с плавающей точкой и входов / выходов для увеличения точности и качества рендеринга;
- улучшена производительность, в том числе экземпляров геометрических шейдеров, экземпляров массивов, а также новым подходом запросов к таймеру.
Все это дает максимальную гибкость и охват платформ для разработчиков приложений. Полная спецификация OpenGL 3.3 также доступна для скачивания на http://www.opengl.org/registry
OpenGL 4.1
26 июля 2010 года Khronos Group анонсировала спецификацию OpenGL 4.1. Спецификация включает в себя обновление GLSL (GL Shading language) до версии 4.10 и несет в себе как нововведения (такие как обеспечение полной совместимости с OpenGL ES 2.0 API, улучшения взаимодействия с OpenGL, улучшения при работе в WebGL приложениями и другие).
В англоязычной части интернета уже появились новые уроки и демонстрационные программы по использованию OpenGl 3.2 и OpenGL 4.
В скором времени вы сможете прочитать пару слов о спецификации OpenGL 4.1.