Что такое opengl превью
OpenGL — что это такое и для чего нужна такая поддержка?
Здравствуйте, дорогие читатели! Сегодня мы с вами разберем OpenGL — что это такое, для чего используется, требуется ли что то настраивать для его эксплуатации.
Что это за программа
И сразу же хочу уточнить, что это вовсе не программа в привычном понимании, не драйвер, не протокол и не служба.
OpenGL — спецификация, которой определяется программный интерфейс для написания приложений, использующих 2D и 3D графику. По сути, это инструмент, который регулирует рендеринг изображения видеокартой.
Название расшифровывается как Open Graphics Library, то есть «Открытая графическая библиотека». Открытость инструмента означает, что им может воспользоваться любой разработчик без всякой маржи и лицензионных отчислений.
Инструмент кроссплатформенный: созданные с его помощью приложения будут работать в любой среде, которые осуществляют его поддержку.
При этом работать будут одинаково все в зависимости от мощности рабочей станции. Такая реализация освобождает разработчика от необходимости писать код под каждую конкретную платформу, что позволяет полностью сосредоточиться на графической составляющей.
Основные области применения OpenGL — видеоигры, системы автоматизированного проектирования, поддержка виртуальной реальности и визуализация различных проектов. На платформе Windows главным конкурентом технологии является DirectX.
О том, что такое DirectX и зачем он нужен, вы можете почитать вот тут.
Концепция OpenGL была разработана в 1982 году в университете Стэнфорда. Аппаратно прототип технологии впервые реализовала компания Silicon Graphics, создавшая конвейер для рендеринга. Ее разработки стали основой библиотек OpenGL.
Как работает OpenGL
Если смотреть с точки зрения разработчика, то OpenGL — программный интерфейс, который управляет работой видеокарты. Всего есть чуть более 150 команд, с помощью которых программист определяет, какие именно объекты будут отправлены на рендеринг.Этим же стандартом определяются более тонкие настройки: например, тройная буферизация, трассировка лучей или сглаживание в играх.
Нет необходимости создавать разные версии графических объектов для отображения в различных режимах качества графики: все подстраивается «на автомате», исходя из заданных программистов параметров.
Проще говоря, программист определяет отображаемые объекты в трехмерном пространстве, их взаимное положение и взаимодействие, масштабирование, угол обзора и т.д., а также цвет и текстуру, а OpenGL уже заботится об их рендеринге.
Можно утверждать, что этот инструмент только воспроизводит объекты, но не взаимодействует с устройствами ввода — мышью, клавиатурой, геймпадом или игровым рулем. За это, а также за работу менеджера окон, отвечают уже другие компоненты.
Несмотря на кажущуюся сложность, OpenGL имеет четко продуманную структуру и простой процедурный интерфейс. При этом с помощью этого инструмента можно создавать действительно сложные сцены, состоящие из множества компонентов. Вычислительных мощностей требуется меньше по сравнению с другими библиотеками.
Некоторые версии OpenGL поддерживают работу по сети: объекты рендерятся на сервере, а клиентское приложение получает только их отображение. Благодаря этому можно создавать мощные воспроизводящие комплексы, состоящие из множества компьютеров.
Следует отметить, что в отличие от главного конкурента OpenGL можно считать универсальным инструментом. Главный конкурент, DirectX, «заточен» именно под игры. Многие игры поддерживают обе технологии.
Нужно ли переключаться между ними? На мой взгляд, нет никакой разницы, что именно вы используете, Независимо от технологии существенной разницы в производительности не замечено, если речь идет о платформе Windows.
Если же вы используете эмулятор Андроид на ПК, в этом случае рекомендую переключиться OpenGL: для систем семейства Unix этот инструмент подходит больше.
Также рекомендую ознакомиться с публикациями «Что делать, если видеокарта не поддерживает DirectX» и «Как посмотреть параметры видеокарты». Буду признателен, если вы расшарите этот пост в социальных сетях. До скорой встречи!
OpenGL в смартфонах — что это и зачем нужно?
Принцип работы и применение технологии OpenGL ES 2.0.
Сейчас трехмерные изображения стали привычными. Чаще всего они встречаются в фильмах со специальными эффектами, компьютерных и мобильных играх. На заре становления компьютерной графики не существовало единого стандарта, и все программы создавались практически «с нуля», на основе своих методов отображения графической информации.
Позже, когда трехмерная графика стала доступной не только для суперокомпьютеров, но и для обычных ПК, появилась насущная потребность в едином стандарте в области графики. Одним из них и стал OpenGL (Open Graphics Library — «открытая графическая библиотека»). На сегодня это один из самых популярных графических стандартов в мире.
OpenGL основан на графической библиотеке IRIS GL, созданной компанией Silicon Graphics. Стандарт был разработан и утвержден в 1992 году целой группой крупнейших разработчиков, в число которых вошли Silicon Graphics, IBM Corporation, Microsoft, Hewlett-Packard Corporation, Sun Microsystems, Intel Corporation, Evans & Sutherland и другие.
Технология OpenGL в телефонах
OpenGL — спецификация, благодаря которой мобильные устройства получили возможность отображать графику уровня игровых приставок. Стандарт включает более 300 функций для отрисовки сложных трехмерных сцен. Он относится к открытым спецификациям, что позволяет написанные с его помощью программы портировать на любые платформы. При этом результат будет одинаковым, будь это мощный профессиональный компьютер или обычный смартфон.
OpenGL позволяет получить на смартфоне более быструю и плавную работу интерфейса, а также высокую производительностью в 3D-приложениях, в том числе и в играх. В современных смартфонах используется версия OpenGL ES 2.0.
Данную опцию можно включить на мобильном устройстве через режим разработчика. Для этого нужно войти в «Настройках» в раздел «О телефоне» и 7 раз подряд нажать по надписи с версией операционной системы или по версии сборки (в зависимости от производителя). Далее нужно найти в разделе «Для разработчиков» опцию 4X MSAA. Если ее включить, активируется четырехкратное сглаживание в технологии OpenGL ES 2.0. Это улучшит качество графики на смартфоне, но приведет к более быстрой разрядке аккумулятора.
Стандарт OpenGLв смартфонах позволяет значительно повышать качество графики в приложениях и играх. Минус этой спецификации — высокая нагрузка на системные ресурсы и батарею устройства.
Урок №1. Что такое OpenGL?
Обновл. 30 Окт 2021 |
Перед началом нашего путешествия мы должны определиться с тем, что такое OpenGL.
Что такое OpenGL?
OpenGL (англ. «Open Graphics Library») рассматривается как API (англ. «Application Programming Interface» = «Интерфейс прикладного программирования»), предоставляющий большой набор функций, которые мы можем использовать для управления графикой и изображениями. Если конкретнее, то OpenGL является спецификацией, разработанной и поддерживаемой Khronos Group.
Спецификация OpenGL определяет, каким должен быть результат/вывод каждой функции, и как она должна выполняться. А вот реализация этой спецификации уже зависит от конкретных разработчиков. Поскольку спецификация OpenGL не предоставляет нам подробностей реализации, то, фактически, разработанные версии OpenGL могут иметь разные реализации до тех пор, пока их результаты соответствуют спецификации (и, следовательно, являются одинаковыми для пользователя).
Люди, разрабатывающие библиотеки OpenGL, обычно являются производителями видеокарт. Каждая приобретаемая вами видеокарта поддерживает определенные версии OpenGL, разработанные специально под эту линейку видеокарт. При использовании программного обеспечения от Apple библиотека OpenGL поддерживается, собственно, разработчиками Apple, а в Linux существует целый набор версий графических поставщиков и адаптации от опенсорс-сообщества этих библиотек. Это также означает, что всякий раз, когда OpenGL демонстрирует странное поведение, которого не должно быть, то это, скорее всего, вина производителей видеокарт (или тех, кто разрабатывал/поддерживает эту библиотеку).
Поскольку большинство реализаций OpenGL созданы производителями видеокарт, то всякий раз, когда находится баг в реализации, это обычно решается обновлением драйверов вашей видеокарты. Эти драйверы включают в себя последние версии OpenGL, которые поддерживает ваша видеокарта. Это одна из основных причин, по которой всегда рекомендуется обновлять графические драйверы.
Khronos публично размещает все спецификации документов для всех версий OpenGL. Заинтересованный читатель может посмотреть спецификацию OpenGL версии 3.3 (которую мы и будем использовать) здесь, где он сможет углубиться в детали OpenGL (обратите внимание, что в данной спецификации в основном просто описываются результаты, а не реализации). Эта спецификация также предоставляет отличную справочную информацию для понимания того, какой результат выполнения функций должен быть.
Core-profile vs. Непосредственный режим
В старые времена использование OpenGL означало разработку в непосредственном режиме (так называемом «конвейере фиксированных функций»), который был простым в использовании методом для рисования графики. Большая часть функционала OpenGL была скрыта внутри библиотеки, и разработчики не имели контроля над тем, как OpenGL выполняет свои вычисления. Поскольку разработчики жаждали большей гибкости, то со временем спецификации стали более гибкими; разработчики получили больше контроля над своей графикой. Непосредственный режим действительно прост в использовании и понимании, но он также крайне неэффективен. По этой причине, начиная со спецификации версии 3.2, функционал непосредственного режима начали считать устаревшим, мотивируя тем самым разработчиков перейти на разработку в режиме core-profile, который является разделом спецификации OpenGL с полностью удаленным устаревшим функционалом.
Используя режим core-profile, OpenGL заставляет нас применять современные техники. Всякий раз, когда мы пытаемся использовать одну из устаревших функций OpenGL в режиме core-profile, OpenGL выбрасывает ошибку и останавливает рисование. Преимуществом изучения современного подхода является его гибкость и эффективность. Тем не менее, учить его уже несколько сложнее. Непосредственный режим довольно сильно абстрагировался от реальных операций, выполняемых OpenGL, и, хотя это было легко освоить, трудно понять, как на самом деле работает OpenGL. Современный подход требует от разработчика понимания работы OpenGL и графического программирования, и, хотя это немного сложно, это обеспечивает гораздо большую гибкость и эффективность.
Это также одна из причин, по которой данный туториал более ориентирован на core-profile в OpenGL версии 3.3.
На сегодняшний день доступны более новые версии OpenGL (на момент написания — версия 4.6), поэтому следует логичный вопрос: «Почему я должен изучать OpenGL 3.3, когда уже есть OpenGL 4.6?». Дело в том, что все последующие версии OpenGL, начиная с версии 3.3, добавляют дополнительные полезные возможности в OpenGL без изменения фундаментального ядра/базиса, используемого в OpenGL; более новые версии просто предоставляют несколько более эффективных или полезных способов решения одних и тех же задач. В результате все концепции и техники остаются неизменными при выходе новых версий OpenGL, поэтому изучение OpenGL 3.3 является совершенно справедливым.
Примечание: При использовании функционала самых последних версий OpenGL только самые современные видеокарты смогут запустить ваше приложение. Именно поэтому большинство разработчиков обычно ориентируются на более ранние версии OpenGL и только лишь при необходимости подключают функционал более новых версий.
Расширения в OpenGL
Отличительной особенностью OpenGL является поддержка расширений. Всякий раз, когда графическая компания выкатывает новую методику или новую большую оптимизацию для рендеринга, это часто встречается в расширении, реализованном в драйверах. Если оборудование, на котором работает приложение, поддерживает такое расширение, то разработчик может использовать функционал, предоставляемый этим расширением, для более продвинутой или эффективной графики. Таким образом, графический разработчик уже может использовать новые методы рендеринга, просто проверяя, поддерживается ли данное расширение видеокартой, при этом не дожидаясь, пока OpenGL добавит этот функционал в свою новую версию. Часто, когда расширение является популярным или очень полезным, оно в конечном итоге становится частью новой версии OpenGL.
Разработчик должен знать, доступны ли какие-либо из этих расширений, прежде чем их использовать (или использовать библиотеку расширений OpenGL). Это позволяет разработчику делать вещи лучше или эффективнее в зависимости от того, доступно ли расширение:
OpenGL ES 2.0 для начинающих
Одна из самых мощный сторон современных мобильных устройств Apple- это графическая подсистема, позволяющая писать качественные 2d и 3d игры с отличной производительностью и детальной графикой. О ней я и хочу рассказать, так как в интернете для новичков информации про OpenGL ES 2.0 на русском языке очень мало.
Итак, что же такое OpenGL? Это Открытая графическая библиотека (Open Graphics Library), которая имеет свой api, свои переменные, и является самой ближайшей точкой взаимодействия между процессором и графическим чипом (GPU).
Как работает OpenGL
В устройствах на iOS есть центральный процессор (CPU) и графический процессор (GPU). GPU призван разгрузить центральный процессор от обработки графических данных перед выводом на экран.
Другими словами, OpenGL позволяет рассчитывать все детали конечного изображения на графическом чипе (Графический чип в разы быстрее в расчетах чисел с плавающей точкой), а центральный процессор оставить для других расчетов, например, игровой логики.
Так же OpenGL предоставляет множество возможностей для хранения информации, данных и изображений в оптимальном для графического чипа формате для более быстрой обработки. Эти данные будут обрабатываться напрямую непосредственно графическим чипом.
Логика OpenGL
Примитивы
Буферы
Визуализирующий буфер это временное хранилище для одного изображения. Этот буфер представляет из себя коллекцию кадровых буферов. Существует несколько видов визуализации буфера: цвет, глубина и шаблон.
буфер визуализации цвета хранит итоговое цветное изображение, созданное рендером OpenGL. Это цветное (RGB) изображение.
буфер визуализации глубины хранит координату глубины (точка z) объектов в пространстве.
буфер визуализации шаблона хранит видимую часть объекта (как маску видимой части). В буфере хранится черно-белое изображение.
Растеризация
Растеризация это процесс, когда OpenGL собирает всю информацию о 3d объектах (координаты, вершины и т. д. ) и создает 2d изображение, как правило для отображения на экране устройства.
В реализации OpenGL Apple вы не можете вывести изображение сразу на экран, а должны обязательно его поместить в кадровый буфер, а уже оттуда, средствами EAGL (Extended Apple GL) вывести его на экран устройства.
Конвейеры OpenGL
В OpenGL ES 2.0 используется программируемый конвейер. Это означает что вся ответственность за камеры, освещение, эффекты лежит полностью на разработчиках. Делается все это шейдерами. Таким образом, когда слышите о программируемом конвейере, думайте о шейдерах 🙂
Шейдеры это такие маленькие кусочки кода, маленькие программки, которые выполняются непосредственно на графическом чипе для совершения сложных расчетов.
Фиксированный конвейер это полная противоположность программируемому. Фиксированный конвейер предоставляет api для управления камерой, освещением, эффектами, материалами.
Для создания шейдеров в OpenGL ES используется язык, весьма похожий на C, называемый OpenGL ES Shader Language (GLSL ES или ESSL).
Как же работают шейдеры? Вы создаете их либо в отдельных файлах, либо прямо в коде, главное что бы строка, содержащая код шейдера, была отправлена в ядро OpenGL и скомпилирована там для использования.
Шейдеры работают в паре — вершинные шейдеры и фрагментные. Что бы понять что каждый из них означает, вернемся к примеру с кубом.
Вершинный шейдер
Вершинные шейдеры (vertex shader), так же известные как VS или VSH, это маленькие программы, которые выполняются для каждой вершины. Если посмотреть на куб на рисунке выше, то у куба получается 8 вершин (5 вершина невидимая). Соответственно вершинный шейдер обработает этот куб 8 раз на графическом процессоре.
Вершинный шейдер задаст конечные позиции вершин с учетом положения камеры, а так же подготовит и выведет некоторые переменные, требуемые для фрагментного шейдера. В OpenGL мы не можем задавать переменные напрямую для фрагментного шейдера, только через вершинный. Почему нельзя обращаться к фрагментному шейдеру напрямую? Давайте рассмотрим.
Фрагментный фейдер (fragment shader, FSH)
Давайте посмотрим вновь на куб.
5 вершина невидимая по причине местоположения и поворота куба в пространстве, значит мы можем видеть только 3 стороны куба, и они составляют 7 вершин.
Это то, что делает фрагментный шейдер. Он обрабатывает каждую видимую часть конечного изображения. Можно преставить каждую часть как пиксель, но это не совсем так, потому что пиксеть в рендеринге OpenGL и в итоговом изображение, которое вы видите на экране, может различаться по размеру. Таким образом фрагмент может быть больше или меньше нежели реальный пиксель, в зависимости от конфигурации устройства и параметров рендеринга. В кубе, приведенном выше, фрагментный шейдер обработает каждый пиксеть на всех 3х сторонах куба, сформированных с помощью 7 вершин.
Внутри фрагментного шейдера мы будем работать со всем, что связано с поверхностью- освещение, тени, отражения, текстуры и любые эффекты, которые вы захотите. Результат работы фрагментного шейдера это цвет пикселя в формате RGBA (красный, зеленый, синий и альфа-канал).
Вершинный и фрагментный шейдеры работают вместе. Один вершинный шейдер и один фрагментный, не больше и не меньше. Что бы гарантировать, что м ы не наделаем ошибок, OpenGL всегда компилирует пару VSH и FSH.
Ошибки в OpenGL
Так как OpenGL это отдельный api и выполняется он в графическом чипе, вы не имеете прямого доступа к процессам, происходящим внутри. Поэтому если возникает ошибка внутри, то с вашим приложением ничего не случится.
Но как узнать, что если в одном из шейдеров есть ошибка или буфер рендеринга настроен неправильно? Для таких случаев в OpenGL есть специальный Error api. Он весьма прост и состоит из нескольких функций, одна из которых это простая проверка успешность завершения каких либо операций, возвращающая yes или no. Таким образом очень просто быстро проверить есть ли ошибки, и, если таковые имею место быть, то вы получите сообщение с ошибкой. Обычно проверки размещаются в критических точках приложения, например при компиляции шейдеров или при создании буферов.
Если тема будет интересна, продолжу уже с реальными примерами для iOS.
Немного Об OpenGL
Как известно, OpenGL расшифровывается как Open Graphics Library, что в переводе на русский язык означает «открытая графическая библиотека».
За следующие 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 в зависимости от потребностей рынка.
Основные изменения
Все это дает максимальную гибкость и охват платформ для разработчиков приложений. Полная спецификация 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.