Как узнать версию opengl

от admin

How do I know which version of OpenGL I am using?

I started writing programs, in C (for now) using GLFW and OpenGL. The question I have is that, how do I know which version of OpenGL my program will use? My laptop says that my video card has OpenGL 3.3. Typing «glxinfo | grep -i opengl» returns:

So is OpenGL 3.3 automatically being used ?

1 Answer 1

Just call glGetString(GL_VERSION) (once the context is initialized, of course) and put out the result (which is actually the same that glxinfo does, I suppose):

Your program should automatically use the highest possible version your hardware and driver support, which in your case seems to be 3.3. But for creating a core-profile context for OpenGL 3+ (one where deprecated functionality has been completely removed) you have to take special measures. But since version 2.7 GLFW has means for doing this, using the glfwOpenWindowHint function. But if you don’t want to explicitly disallow deprecated functionality, you can just use the context given to you by the default context creation functions of GLFW, which will as said support the highest possible version for your hardware and drivers.

But also keep in mind that for using OpenGL functionality higher than version 1.1 you need to retrieve the corresponding function pointers or use a library that handles this for you, like GLEW.

Как узнать версию opengl

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

Содержание

Структура API OpenGL

API OpenGL описан на языке C без применения C++ ради простоты и платформонезависимости. Он состоит только из функций, констант и примитивных типов, объявленных через typedef , таких как «typedef int GLenum;» .

Функции делятся на две группы:

  • команды (англ. commands) для изменения состояния драйвера
  • запросы (англ. queries) состояния драйвера

Вот несколько примеров:

  • функция-команда void glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) устанавливает цвет очистки; RGBA компоненты цвета передаются как число с плавающей точкой на отрезке [0..1] .
  • функция-команда void glClear() очищает буфер кадра путём заливки пикселей цветом очистки.
  • функция-запрос const GLubyte *glGetString(GLenum name) возвращает строковое значение некоторой константы или величины в видеодрайвере, выбор величины зависит от параметра name ; при этом const GLubyte* можно преобразовать в const char* с помощью reinterpret_cast .
  • тип данных GLclampf означает “число с плавающей точкой на отрезке [0..1] ”; при этом никаких проверок принадлежности диапазону компилятор делать не будет, потому что тип объявлен просто как typedef float GLclampf .

Функции-команды ничего не возвращают, даже статуса своего выполнения. Это даёт возможность выполнить команду асинхронно, не заставляя приложение ждать, пока видеодрайвер отправит данные на видеокарту и получит от неё ответ.

Обработка ошибок

OpenGL старательно обрабатывает ошибки, такие как “недопустимый аргумент”, “неправильная константа enum”, “несвоевременный вызов команды”. Узнать о наличии общей ошибки в одной из предыдущих функций-команд можно функцией-запросом GLenum glGetError() .

  • Если функция возвращает GL_NO_ERROR , ошибок не было
  • В противном случае код ошибки обозначает категорию ошибки без конкретных указаний
  • Функция не только возвращает код ошибки, но и очищает флаг ошибки в драйвере

Условно, код может выглядеть так:

Функцию можно улучшить, если учесть следующее:

  • Распечатать строку ошибки можно в поток ошибок std::cerr
  • Любую ошибку можно считать фатальной, вызывая std::abort для аварийного завершения программы после вывода текста ошибки
  • Функцию можно сделать статическим методом класса CUtils

Представим улучшенную версию:

После добавления этого метода можно улучшить основной цикл приложения:

Расширения OpenGL

В целях максимальной гибкости, все изменения в OpenGL вносятся в виде расширений. Расширение OpenGL — это задокументированная спецификация, которая описывает новые функции и их поведение, изменения в поведении старых функций и новые константы. Каждое расширение имеет имя, например, «GL_ARB_multitexture» . При выпуске новой версии OpenGL часть расширений попадает в новую версию и становится частью ядра OpenGL. Таким образом, в версии OpenGL 3.0 и выше вы автоматически получаете ряд возможностей, которые в OpenGL 1.2 были доступны только как расширения.

  • В UNIX-системах и на мобильных устройствах доступны достаточно свежие версии OpenGL (обычно 3.0 и выше), где многие важные расширения уже стали частью ядра стандарта.
  • В Windows версии старше OpenGL 1.1 напрямую недоступны, но разработчики драйверов дают доступ к ним через механизм расширений. Если видеодрайвер не установлен, будет доступен только OpenGL 1.1, обладающий весьма ограниченными возможностями.

Функция, описанная в расширении, может не существовать в конкретной реализации OpenGL (если она не поддерживает данное расширение). Поэтому программист должен

  • либо запросить адрес функции и использовать её, только если адрес ненулевой
  • либо проверить наличие поддержки расширения по его имени и потом смело запрашивать адреса описанных в расширении функций

В стандарте OpenGL не описан способ получения адреса, и каждая операционная система или мультимедийная библиотека предоставляет свой способ. В SDL2 есть функция void *SDL_GL_GetProcAddress(const char *proc) , которая по имени OpenGL-функции возвращает её адрес или nullptr , если функция недоступна.

Получение информации о версии OpenGL

Один и тот же видеодрайвер может создать разные констексты с разными версиями OpenGL и разными наборами расширений. Поэтому получать версионную информацию следует уже после создания контекста.

Для получения информации мы применим функцию-запрос glGetString с тремя различными параметрами. На эту тему есть статья Get Context Info (opengl.org).

  • константа с именем GL_VERSION возвращает строку версии OpenGL, причём в начале строки обязательно стоит «<номер мажорной версии>.<номер минорной версии> » , а остальная часть строки не определена. Например, строка «3.0 Mesa 10.3.2» обозрачает “OpenGL версии 3.0, реализуемый подсистемой графики Mesa версии 10.3.2”.
  • константа с именем GL_VENDOR возвращает имя поставщика реализации OpenGL. Например, строка «Intel Open Source Technology Center» обозначает “Видеодрайвер предоставлен OpenSource-подразделением корпорации Intel”.
  • константа с именем GL_EXTENSIONS содержит полный список расширений, разделённый пробелами. Список обычно насчитывает свыше ста расширений.

Функция печати информации о контексте

Следуя “правилу трёх ударов”, можно отрефакторить этот код:

Библиотека GLEW

  • Сайт проекта: http://glew.sourceforge.net/
  • В Debian/Ubuntu доступна в пакете libglew-dev

Запрашивать функции и проверять расширения вручную не всегда удобно. Для решения этой типовой задачи создана библиотека GLEW (сокращение от “openGL Extensions Wrapper”). С помощью макросов и отложенной загрузки адресов функций эта библиотека позволяет использовать расширения так, как будто бы никаких расширений не существует:

  • вы просто вызываете функции по имени; если функции нет, произойдёт разыменование нулевого указания
  • также вы можете использовать модифицированное имя расширения (с префиксом “GLEW_” вместо “GL_”) как целочисленную переменную со значением 0 или 1; 1 означает, что расширение есть и доступно, 0 означает, что расширения нет или оно недоступно
  • если расширение недоступно, вы не должны вызывать функции расширения, чтобы не получить разыменование нулевого указателя
  • если при создании контекста OpenGL вы потребовали и получили контекст не ниже определённой версии, то можно даже не проверять расширения, вошедшие в эту версию: они есть.
Читать:
Как сделать задержку в bat файле

Подключать заголовок glew.h следует до первого включения gl.h , иначе вы получите ошибку при компиляции.

Библиотека GLEW требует явного вызова функции glewInit для своей инициализации. Сделать вызов следует только один раз. Чтобы не накладывать на класс CAbstractWindow лишних ограничений, нужно гарантировать, что при первом конструировании объекта CAbstractWindow функция будет вызвана, а при последующих — уже нет. Также надо установить глобальную переменную-флаг glewExperimental , чтобы GLEW оборачивала функции из версий OpenGL 3.x и 4.x.

Для этой цели можно использовать два подхода

  • взять из стандартного заголовка <mutex> функцию std::call_once
  • завести в функции статическую переменную типа bool, которая будет устанавливаться в false в инициализаторе (который для статических переменных внутри функции вызывается ровно один раз)

В многопоточной среде было бы правильным использовать call_once, чтобы исключить возможность повторного вызова инициализации во время выполнения “glewInit” в другом потоке. Однако, ни контекст OpenGL, ни GLEW не могут использоваться из нескольких потоков одновременно. Поэтому call_once нам не потребуется, и достаточно статической переменной типа bool:

Узнаём о расширениях через GLEW

Читать полный список расширений, полученный через glGetString(GL_EXTENSIONS) , не очень удобно. Сканировать его программно слишком трудоёмко в плане вычислений.

Для удобного получения расширений у GLEW есть переменные-флаги, которые устанавливаются при вызове glewInit() . Для проверки наличия расширения надо:

  • найти идентификатор расширения в реестре расширений (opengl.org), например, GL_ARB_vertex_shader
  • заменить префикс GL_ на GLEW_
  • написать проверку переменной-флага с таким именем

Теперь можно улучшить функцию PrintOpenGLInfo :

На машине с Ubuntu 14.04 и встроенной видеокартой Intel программа выводит следующее:

На машине с Windows 8 и видеокартой Intel вывод отличается:

Создаём работоспособное приложение

Код запроса версии OpenGL разместим в классе CWindow , потому что в дальнейших примерах нам уже не нужно будет печатать что-либо в консоль.

Как установить OpenGL в Windows

Современные компьютеры становятся все мощнее, и, соответственно, для их нормального функционирования необходимо качественное программное обеспечение. Все чаще для игр, 3D-моделирования и видеомонтажа используются графические библиотеки OpenGL. Сегодня я расскажу, для чего они нужны в операционной системе, как определить, поддерживается ли данная технология на компьютере, и опишу несколько способов установки в Windows 7 и Windows 10.

Для чего нужен OpenGL

OpenGL расшифровывается как Open Graphics Library и представляет собой интерфейс прикладного программирования API с открытым исходным кодом. Данное ПО используется для масштабирования 2D и 3D графики векторного типа, программирования, создания компьютерных игр, а также обеспечения качественного рендеринга.

Как определить, какая версия OpenGL установлена в Windows

В любой современной операционной системе, не только Windows, поддержка OpenGL встроена. Но даже несмотря на это, необходимо убедиться, действительно ли данное ПО установлено на компьютере. Проверить это очень легко — скачивать сторонние программы пользователю не придется. Нужно лишь открыть настройки видеокарты и перейти в раздел с основными сведениями. Обычно данный раздел отображается в контекстном меню рабочего стола или в скрытых значках на панели задач.

Как узнать версию OpenGL в настройках графической карты Intel

Вот так отображается версия OpenGL в настройках видеокарты Intel

Как определить версию OpenGL в видеокарте компании AMD

В разделе «Настройки» графических карт AMD тоже отображается установленная на данный момент версия OpenGL

Как установить OpenGL на разные видеокарты

Для установки или обновления OpenGL необходимо просто своевременно загрузить последнюю версию драйвера видеокарты. И сделать это можно как через официальный сайт производителя чипсета, так и с помощью встроенной в систему утилиты «Диспетчер устройств».

Скачивать обновления драйверов видеокарты желательно именно с официального сайта компании AMD. На нем можно подобрать конкретный тип процессора и серию. После автоматически начнется скачивание обновления. Но стоит учитывать, что на этой странице может не оказаться драйверов устаревших моделей видеокарт, но на самом сайте они есть, их лишь нужно найти. Для этого стоит вводить запрос напрямую в поисковике, а затем открывать официальную страницу и скачивать софт.

Скачивание и обновление OpenGL на сайте AMD

На сайте AMD предлагаются обновления отдельно для ОС Windows 7 и 10

Intel

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

Загрузка драйверов и ПО OpenGL через официальный сайт компании Intel

Здесь предлагаются обновления драйверов на официальном сайте Intel

Скачивание драйверов и обновление OpenGL через Центр загрузки Intel

Доступно также скачивание с Центра загрузки компании, причем здесь есть фильтр по операционным системам

NVIDIA GeForce

На сайте NVIDIA поиск производится куда проще. Можно указать тип устройства, его серию, операционную систему, язык и даже вид драйвера. Есть еще вариант автоматического поиска, в котором сначала будет проведено сканирование, а уже затем при необходимости будет предложена оптимальная версия драйвера.

Как скачать OpenGL с обновлениями драйвера на видеокарту NVIDIA

Компания NVIDIA предусматривает два варианта загрузки с официального сайта

Диспетчер устройств

Еще один вариант, более упрощенный и доступный, особенно в Windows 10 – поискать обновления через «Диспетчер устройств». Открыть его можно, нажав на комбинацию клавиш Win + X и найдя в контекстном меню соответствующий пункт.

Как открыть «Диспетчер устройств», обновить драйверы видеокарты и версию OpenGL

Для начала я открою «Диспетчер устройств» через контекстное меню иконки «Пуск»

В новом окне открываю раздел «Видеоадаптеры», жму правой кнопкой мыши по нужному графическому процессу, затем выбираю пункт «Обновить драйвер». Система предложит установить их с компьютера или скачать онлайн. Во втором случае начнется поиск обновлений.

Как обновить драйверы и версию OpenGL через «Диспетчер устройств»

Жму правой кнопкой мыши по нужному видеоадаптеру и обновляю драйвера

Загрузка установщика из Интернета

Допустим еще вариант скачивания установщика OpenGL из сети Интернет. Правда, официального сайта в этом случае нет, поэтому данная процедура проводится на страх и риск пользователя. Если источники проверенные, можно скачать и установить приложение без особых колебаний и помех.

Заключение

Обычно OpenGL заранее бывает установлен в системе, вне зависимости от ее версии и новизны аппаратной части компьютера. Если в каких-то играх или программах требуется обновление данного ПО, можно для начала попробовать скачать и установить новую версию драйверов. После этого проблема обычно исчезает. Есть также вариант загрузки через «Диспетчер устройств» или инсталляция приложения, скачанного из сети Интернет.

Форум русскоязычного сообщества Ubuntu

*

Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

  • Форум русскоязычного сообщества Ubuntu »
  • Архив »
  • Архив »
  • Архив тем до 2020г »
  • Как узнать установленную версию OpenGL ?

Автор Тема: Как узнать установленную версию OpenGL ? (Прочитано 5903 раз)

0 Пользователей и 1 Гость просматривают эту тему.

  • Форум русскоязычного сообщества Ubuntu »
  • Архив »
  • Архив »
  • Архив тем до 2020г »
  • Как узнать установленную версию OpenGL ?

Страница сгенерирована за 0.143 секунд. Запросов: 23.

© 2012 Ubuntu-ru — Русскоязычное сообщество Ubuntu Linux.
© 2012 Canonical Ltd. Ubuntu и Canonical являются зарегистрированными торговыми знаками Canonical Ltd.

Похожие статьи