Как установить opengl
Для выполнения 3-го и 4-го разделов курса Компьютерной Графики вам потребуются относительно новые возможности OpenGL, которые опираются на стандарт OpenGL 3.2 и выше. Старые видеодрайверы и видеокарты, возможно, не обеспечивают нужную версию OpenGL, либо не поддерживают некоторые расширения.
В этой статье изложено пять разных способов обеспечить себе хорошую поддержку OpenGL. С таким обилием вариантов отговорки из разряда “у меня не устанавливается X” становятся просто неприличными…
Способ первый: использовать современный драйвер
- На компьютере должен быть установлен относительно свежий видеодрайвер
- Если у вас используется гибридная графическая система видеокарта Intel + видеокарта NVIDIA, то лучше переключиться на видеокарту NVIDIA в настройках программы NVIDIA Settings, поставляемой вместе с драйвером.
- Если у вас используется гибридная графическая система видеокарта Intel + видеокарта AMD, то лучше переключиться на видеокарту AMD в настройках программы AMD Catalyst, поставляемой вместе с драйвером.
Способ второй: установить Ubuntu
Этот способ подходит для старых компьютеров и компьютеров с единственной видеокартой от Intel. Однако, стоит помнить, что низкая производительность старых компьютеров в любом случае помешает нормальному процессу разработку.
Чтобы получить OpenGL 3.2 на любой машине, достаточно установить Ubuntu 14.04.5. Открытый видеодрайвер Mesa в этой версии предоставляет OpenGL 3.3 даже в программной реализации.
- Не стоит ставить Ubuntu на виртуальную машину: вполне возможно, что графическое оборудование станет недоступным для Ubuntu и ей придётся переключиться на программную реализацию OpenGL
- Программная реализация OpenGL (Mesa LLVMpipe) будет работать медленнее аппаратной, на сложных сценах и играх FPS может падать до 4-5 кадров в секунду. Тем не менее, вы получите OpenGL 3.3 со всеми его возможностями
- Аппаратные реализации предоставляют различные версии OpenGL в зависимости от драйвера, но в любом случае не меньше OpenGL 3.3. Открытые видеодрайверы могут работать с видеокартами основных трёх производителей: NVIDIA, AMD (ATI), Intel
Способ третий: понизить требования к OpenGL
В примерах к этой главе стоит проверка, которая выбросит исключение в случае, если видеодрайвер не поддерживает полностью стандарт OpenGL 3.2:
void CheckOpenglVersion() if (!GLEW_VERSION_3_2) throw std::runtime_error("Sorry, but OpenGL 3.2 is not available"); > >
На деле, вы спокойно можете отключить эту проверку и запустить некоторые примеры даже на устаревших драйверах. Более того, поддержка шейдеров появилась в виде расширения GL_ARB_shader_object ещё до появления шейдеров в стандарте OpenGL. Если ваш видеодрайвер сильно устарел и glUseProgram не работает, проверьте поддержку этого расширения. Если поддержка есть, замените функции для работы с шейдерами на альтернативы, описанные в спецификации расширения.
Способ четвёртый: мобильная разработка под Android
Современные Android-устройства поддерживают стандарт OpenGL ES 2.0, во многом эквивалентный стандарту OpenGL 3.2 в режиме Compatibility Profile. Библиотеки SDL2, GLM, boost собираются и работают на Android; библиотека GLEW не нужна, т.к. нужная функциональность доступна через системные заголовочные файлы.
Таким образом, можно разрабатывать на тех же инструментах на Android NDK, или даже адаптировать для Android некоторые примеры к статьям.
Способ пятый: звонок другу
Если ни один из перечисленных способов по каким-либо причинам недоступен, вполне возможно договориться с другом и работать за его компьютером, делая разные варианты лабораторных сначала за него, а потом за себя.
Такой способ практиковался на ПС в конце 90-х, когда доступ к компьютеру с процессором Intel и ОС Windows был далеко не у всех.
PS-Group
- PS-Group
- sshambir@gmail.com
- ps-group
- image/svg+xml sshambir
OpenGL программирование/Установка/Linux
Большинство дистрибутивов Linux опираются на Mesa3D проект что бы обеспечить реализацию OpenGL. Они регулярно поставляют OpenGL библиотеки, а так же OpenGL ES 1.x и 2.0.
Точные имена пакетов необходимых для установки сильно зависят от дистрибутива. Ссылаясь на пакеты вашего дистрибутива, вы можете спасти себя от траты времени и головной боли в установке. Используйте ваш любимый менеджер пакетов и поиск по названию пакета. Вам, возможно, потребуется установить пакеты, с DEV суффиксом, это пакеты разработки (обычно файлы заголовков). Также смотрите в пакетах с lib-префиксом, которые относятся к библиотекам.
Установите GCC C/C++ компиляторы и связанные с ними инструменты, такие как make.
В общем, установите следущее:
Библиотеки [ править ]
В этом Викиучебнике, мы будем использовать GLEW, FreeGLUT и GLM, убедитесь, что вы установите библиотеки разработчика (примечание переводчика dev библиотеки):
Если GLM не доступен в вашем репозитории, у вас есть возможность установить его вручную. Убедитесь, что заголовки размещены в каталоге /usr/include/glm . Так как это только заголовки библиотеки, вам не нужно компилировать .so библиотеки — просто скопируйте код.
Драйверы [ править ]
OpenGL является основным API 3D-графики в GNU/Linux-based системах. Если ваше устройство поддерживает 3D ускорение на GNU/Linux, оно, вероятно, включает в себя OpenGL.
OpenGL включается в драйверах, так что вы должны убедиться, что драйверы были установлены корректно, если вы хотите запускать программы с использованием OpenGL. Драйверы с открытым исходным кодом, на самом деле, используют реализацию Mesa в OpenGL. Фирменные драйверы поставляют собственную библиотеку OpenGL.
Фирменные варианты [ править ]
Компания Nvidia обеспечивает в целом хороший, но не свободный драйвер nvidia. fglrx драйвер для многих современных устройств AMD; он также имеет закрытый исходный код и доступен на сайте AMD.
Свободные/Open-Source варианты. [ править ]
Если ваш процессор Intel с встроенной графикой, то необходимые драйверы с открытым исходным кодом поставляются в качестве стандартной части ядра Linux.
Если у вас установлен один из новейших чипов, вам возможно придётся использовать посредственный fglrx драйвер. Однако AMD выпустила спецификации для своих чипов, ‘Radeon’ с открытым исходным кодом сделал свой путь, для того чтобы стать полнофункциональным 2D и 3D драйвером.
По состоянию на июнь 2013 года, большинство чипов AMD хорошо работают с исходным драйвером «Radeon». 3D производительность с драйвером AMD Catalyst на современных картах еще лучше, но это может измениться в будущем. Можете проверить таблицу характеристик.
Nouveau драйвер с открытым исходным кодом поддерживает чипсеты NVIDIA, но в момент написания не так полон, как драйвера с закрытым исходным кодом от NVIDIA, поддержка 3D может быть не удовлетворительна.
Драйвер OpenGL на Linux-системах состоит из двух файлов:
А так же многие OpenGL приложения требуют libGLU.so; Операции GLU не могут быть аппаратно ускоренны, поэтому реализация Mesa является отличным вариантом.
Проверьте ваши сведения о OpenGL [ править ]
Введите это в терминале, чтобы получить больше информации о вашем OpenGL драйвере, включая поддерживаемые расширения:
glxinfo | grep OpenGL
IDEs [ править ]
The tutorials will mostly rely on simple Makefile s to build the code, and let you edit the source with your favorite text editor, such as Emacs, vim, gedit, kwrite, etc.
Существует несколько IDE для GNU/Linux, такие как:
- Code::Blocks
- Anjuta
- KDevelop
- Eclipse CDT
Очень просто приспособить Мейкфайлы к этим системам.
Installing your own OpenGL headers [ править ]
In the unlikely event that your distribution does not supply packages for Mesa3D, you can build it from source with the usual
./configure make make install
installation procedure; however, be careful of conflicting opengl libraries.
Mesa’s software implementation may override your distribution’s libraries or libraries manually installed, such as the nvidia or fglrx OpenGL binaries. When this happens, search all directories listed with
ldconfig -Nv 2>/dev/null | awk -F: '/^\// '
for libGL.so. The following command should output all the different OpenGL libraries available on your system:
find $(ldconfig -Nv 2>/dev/null | awk -F: '/^\// ') -name libGL.so -exec realpath <> \; | sort -u
It is usually OK if you have one the mesa library plus the proprietary library. On 64-bits systems, you may also have the lib32 library. Additional copies of libGL.so found in the ld search path (specified in /etc/lf.so.conf by default), if not referring to the same file, usually indicates a conflict. Remove all but the copy you want executed.
The headers will be installed to $PREFIX/include/GL (usually /usr/include/GL when installed from a packaged, or /usr/local/include/GL when installed manually from source).
«Official» OpenGL headers are available from SGI, however, they are hopelessly out of date.
Настраиваем Windows для программирования OpenGL
Пост ориентирован на новичков. В нем не рассматривается настройка Visual Studio. Он научит вас настраивать некоторые текстовые редакторы на компиляцию OpenGL приложений, либо выполнять это из консоли вручную.
Недавно, наконец, вышло 8-е издание книги OpenGL programming guide, которую я ждал уже более чем 2 года. Чуть раньше я познакомился с замечательным текстовым редактором Sublime Text 2 и решил настроить его вместо установки тяжелой Visual Studio.
Итак, для начала нам нужен компилятор — я остановился на G++. Он является частью GCC, а его порт под Windows называется MinGW. С него и начнем:
MinGW
Качаем с официального сайта инсталлятор и запускаем его. Можно выбрать выкачивание свежих пакетов сразу при установке, либо обновить их вручную позже. Компиляторы Fortran, Ada и ObjC нам не понадобятся, их можно не ставить. MSYS Basic System может пригодится, его ставим. В качестве адреса я указал » C:\MinGW «, но если вас это смущает — можете выбрать другой, например, » C:\Program Files\Common Files\MinGW «.
После установки следует добавить к системной переменной PATH две новые папки: » MinGW\bin » и » MinGW\msys\1.0\bin «. Для этого заходим в Пуск -> Панель управления -> Система -> Дополнительные параметры системы; Во вкладке Дополнительно тыкаем внизу кнопку Переменные среды. Из списка системных переменных выбираем Path, и через точку с запятой дописываем полные адреса к папкам » MinGW\bin » и » MinGW\msys\1.0\bin «.
Если вы не выбирали выкачивание свежих пакетов при установке, следует обновить нужные пакеты вручную. Для этого открываем консоль (Win+R -> cmd ), и пишем следующие команды:
mingw-get update
Обновит информацию о доступных пакетах,
mingw-get show gсс mingw-get show g++
Отобразит полные имена пакетов gcc и g++,
mingw-get upgrade mingw32-gcc mingw-get upgrade mingw32-gcc-g++
Обновит эти пакеты до последних доступных для MinGW версий.
Теперь, когда у нас есть компилятор, мы можем приступить к установке необходимых OpenGL библиотек.
Freeglut
Поскольку OpenGL это API, которое относится исключительно к графике — в него не входят функции по созданию окон или обработки устройств ввода. Тем более, решение этой задачи зависит от операционной системы. По-этому ее вынесли в отдельную библиотеку и назвали GLUT — OpenGL Utility Toolkit. Однако, последний релиз этой библиотеки был очень давно и сейчас ее подменила freeglut.
Качаем с официального сайта бинарники под MinGW. Распаковываем, freeglut.dll из папки bin кидаем в » C:\Windows\System32 » (для х86) или » C:\Windows\SysWOW64 » (для х64), или любую другую папку, которая указана в PATH. Содержимое папок include и lib можно скопировать либо в » MinGW\include » и » MinGW\lib » (так будет проще), либо в отдельные созданые папки » MinGW\freeglut\include » и » MinGW\freeglut\lib «.
На этом с freeglut все. Для его подключения нужно добавить #include
glew
Библиотека glew позволяет определять что видеокарта поддерживает, а что — нет. Ее установка немного сложнее для нашего случая.
Качаем с официального сайта исходники, поскольку бинарники заточены под Visual Studio и нам не подойдут. Теперь эти исходники нужно скомпилировать. Я в этом практически ничего не понимаю, по-этому обратился к гуглу и нашел помощь здесь:
Распаковываем скачанный архив, открываем консоль, заходим в полученную папку и пишем следующие команды:
gcc -DGLEW_NO_GLU -O2 -Wall -W -Iinclude -DGLEW_BUILD -o src/glew.o -c src/glew.c gcc -shared -Wl,-soname,libglew32.dll -Wl,--out-implib,lib/libglew32.dll.a -o lib/glew32.dll src/glew.o -L/mingw/lib -lglu32 -lopengl32 -lgdi32 -luser32 -lkernel32 ar cr lib/libglew32.a src/glew.o
В результате в папке lib появилось 3 файла: glew32.dll , glew32.dll.a и glew32.a .
glew32.dll копируем туда же, куда ранее скопировали freeglut.dll , остальные 2 — в папку » MinGW\lib » либо » MinGW\glew\lib «.
Из папки include копируем содерижмое в » MinGW\include » или » MinGW\glew\include «.
На этом с glew все. Для его подключения нужно добавить #include , но сделать это необходимо перед подключением других gl библиотек.
Проверяем работоспособность
Создаем минимальный test.cpp:
#include #include #include #include int main(int argc, char** argv) < glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGBA); glutInitWindowSize(512, 512); glutInitContextVersion(4, 1); // Версия OpenGL, которую вы хотите использовать glutInitContextProfile(GLUT_CORE_PROFILE); glutCreateWindow(argv[0]); if (glewInit()) < std::cerr glutMainLoop(); >
Обратите внимание на функцию glutInitContextVersion — она завершит выполнение программы если ей не удалось создать контекст для указаной версии OpenGL. Чтобы узнать версию OpenGL, которую поддерживает ваша видеокарта, можно заглянуть в ее спецификацию либо скачать бинарники glew с официального сайта и запустить glewinfo.exe из папки bin . Он сгенерирует файл glewinfo.txt , в котором будет детально расписано что ваша видеокарта поддерживает, а что — нет. Иногда функционал можно расширить установкой более свежего видеодрайвера.
Открываем консоль, заходим в папку с test.cpp и пишем следующую команду:
g++ -o test.exe test.cpp -lglew32 -lfreeglut -lopengl32 -lglu32 -Wl,--subsystem,windows
В случае, если вы создавали отдельные папки freeglut и glew , здесь необходимо дополнительно указать соответствующие дополнительные папки include и lib . Тогда пример команды выглядит так:
g++ -o test.exe test.cpp -lglew32 -lfreeglut -lopengl32 -lglu32 -Wl,--subsystem,windows -I"C:\MinGW\freeglut\include" -L"C:\MinGW\freeglut\lib" -I"C:\MinGW\glew\include" -L"C:\MinGW\glew\lib"
Флаг -Wl,—subsystem,windows указывает компилятору что он должен создать графическое приложение, а не консольное.
Если все получилось, должен получится файл test.exe , который при запуске создает белое окно 512х512.
Когда вы захотите поделится своим приложением, убедитесь что вместе с исполняемым файлом передаете используемые библиотеки — freeglut.dll и glew32.dll .
Sublime Text 2
Ну и напоследок, приведу пример настройки Sublime. Скачать его можно отсюда, вводные видео-уроки на английском языке можно глянуть здесь.
После установки открываем файл настройки билда С++:
» C:\Users\%Username%\AppData\Roaming\Sublime Text 2\Packages\C++\C++.sublime-build »
Сохраняем его копию как
» C:\Users\%Username%\AppData\Roaming\Sublime Text 2\Packages\User\C++\С++ OpenGL.sublime-build «
"cmd": ["g++", "$", "-o", "$/$"],
дополняем подключением библиотек:
"cmd": ["g++", "$", "-o", "$/$", "-lfreeglut -lopengl32 -lglew32 -Wl,--subsystem,windows"],
Аналогично, строчку
"cmd": ["bash", "-c", "g++ '$' -o '$/$' && '$/$'"]
дополняем до
"cmd": ["bash", "-c", "g++ '$' -o '$/$' -lglew32 -lfreeglut -lopengl32 -lglu32 -Wl,--subsystem,windows && '$/$'"]
Если вы создавали отдельные папки под freeglut и glew, эти команды следует дополнить указанием адресов дополнительных папок include и lib .
Для того чтобы Sublime не отказывался выводить кириллицу в свою консоль, после
"selector": "source.c, source.c++",
"encoding": "cp1251",
Теперь, когда у нас открыт test.cpp , выбираем Tools -> Build system -> C++ OpenGL.
Нажимаем Ctrl+B для компиляции, Ctrl+Shift+B для компиляции и запуска.
UPD: Когда дело дошло до кода с gl-функциями из последних версий, выяснилось, что подключение заголовочного файла GL/gl.h недостаточно. В нем содержится устаревшая версия 1.1, и этот файл больше не обновляется. В дополнение к нему необходимо подключить GL/glext.h (последнюю версию которого надо скачать отсюда) и GL/wglext.h (отсюда). Для линукса последний файл заменяется GL/glxext.h (ссылка). Скачанными файлами нужно заменить их устаревшие версии по адресу » MinGW/include/GL/ «.
CS332. Компьютерная графика
Существует довольно много библиотек, которые способны отображать окна для Opengl — SDL, Glut (freeglut), QT, SFML, можно даже использовать нативные API операционной системы (вроде Winapi для Windows). Но SFML имеет ряд важных преимуществ, это мультимедийная библиотека, представляющая из себя объектно ориентированный аналог SDL, что делает её гораздо удобнее последней, но при этом более многофункциональной чем, например, Glut. В частности, SFML имеет интерфейс для управления текстурами, тогда как при использовании glut пришлось бы подключать дополнительные библиотеки, такие как SOIL2. Помимо этого, у SFML очень хорошая и удобная документация на официальном сайте.
Установка
Установить SFML и Opengl можно разными способами, но удобно воспользоваться для этого пакетными менеджерами. Для работы в Visual Studio можно воспользоваться nuget, но мне для c++ проектов показался удобнее vcpkg, относительно недавно появившийся мультиплатформенный пакетный менеджер от Microsoft.
Установка vcpkg производится слегка необычным образом, для этого необходимо клонировать репозиторий vcpkg (желательно чтобы в путях установки не было кириллицы, иначе могут возникнуть проблемы)
git clone https://github.com/Microsoft/vcpkg.git
И затем вызвать скрипт загрузки
.\vcpkg\bootstrap-vcpkg.bat
После этого можно устанавливать библиотеки
vcpkg install sfml vcpkg install opengl vcpkg install glew
Установка занимает довольно продолжительное время
Чтобы установленные пакеты были видны из Visual Studio, надо написать следующее
vcpkg integrate install
Обратите внимание, что по умолчанию устанавливаются пакеты 32-битной разрядности, для установки 64-битной версии пакета необходимо явно задать версию.
vcpkg install sfml:x64-windows vcpkg install opengl:x64-windows vcpkg install glew:x64-windows
Работа с SFML и OpenGL
Простая программа на SFMl выглядит следующим образом
#include int main() < // Создаём окно sf::RenderWindow window(sf::VideoMode(200, 200), "SFML window"); // Главный цикл while (window.isOpen()) < sf::Event event; // Цикл обработки событий while (window.pollEvent(event)) < // Событие закрытия окна, if (event.type == sf::Event::Closed) window.close(); > // Перерисовка окна window.display(); > return 0; >
Здесь просто создаётся окно, и до тех пор, пока оно открыто, происходит перерисовка.
Теперь запустим простую программу для работы с OpenGL, которая выводит на экран окно с разноцветным крутящимся квадратом.
ВАЖНО. СЛЕДУЮЩИЙ КОД НАПИСАН С ИСПОЛЬЗОВАНИЕМ УСТАРЕВШЕГО API OPENGL И СЛУЖИТ ИСКЛЮЧИТЕЛЬНО ДЛЯ ПРОВЕРКИ РАБОТОСПОСОБНОСТИ OPENGL И SFML. ОН НЕ ЯВЛЯЕТСЯ ПРИМЕРОМ ИЛИ ЗАГОТОВКОЙ ДЛЯ ВЫПОЛНЕНИЯ ЛАБОРАТОРНЫХ РАБОТ!
#include #include #include void SetIcon(sf::Window& wnd); void Init(); void Draw(); int main() < // Создаём окно sf::Window window(sf::VideoMode(600, 600), "My OpenGL window", sf::Style::Default, sf::ContextSettings(32)); // Ставим иконку (окна с дефолтной картинкой это некрасиво) SetIcon(window); // Включаем вертикальную синхронизацию (синхронизация частоты отрисовки с частотой кадров монитора, чтобы картинка не фризила, делать это не обязательно) window.setVerticalSyncEnabled(true); // Активируем окно window.setActive(true); // Инициализация Init(); // Главный цикл окна while (window.isOpen()) < sf::Event event; // Цикл обработки событий окна, тут можно ловить нажатия клавиш, движения мышки и всякое такое while (window.pollEvent(event)) < if (event.type == sf::Event::Closed) < // Окно закрыто, выходим из цикла window.close(); > else if (event.type == sf::Event::Resized) < // Изменён размер окна, надо поменять и размер области Opengl отрисовки glViewport(0, 0, event.size.width, event.size.height); > > // Очистка буферов glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Рисуем сцену Draw(); // Отрисовывает кадр - меняет передний и задний буфер местами window.display(); > return 0; > // В момент инициализации разумно произвести загрузку текстур, моделей и других вещей void Init() < // Очистка буфера тёмно жёлтым цветом glClearColor(0.5f, 0.5f, 0.0f, 1.0f); > // Глобальные переменные это плохо, тут это сделано просто для примера GLfloat rotate_z = 0; // Функция непосредственно отрисовки сцены void Draw() < rotate_z += 0.5; // Используем устаревшую функциональность установки единичной матрицы преобразования glLoadIdentity(); // С использованием устаревшей функции glRotate домножаем на матрицу поворота glRotatef(rotate_z, 0.0, 0.0, 1.0); // Используем устаревшую конструкцию glBegin-glEnd для рисования квадрата glBegin(GL_QUADS); glColor3f(1.0, 0.0, 0.0); glVertex2f(-0.5f, -0.5f); glColor3f(0.0, 1.0, 0.0); glVertex2f(-0.5f, 0.5f); glColor3f(0.0, 0.0, 1.0); glVertex2f(0.5f, 0.5f); glColor3f(1.0, 1.0, 1.0); glVertex2f(0.5f, -0.5f); glEnd(); // Отправляем набор команд отрисовываться glFlush(); > void SetIcon(sf::Window& wnd) < sf::Image image; // Вместо рисования пикселей, можно загрузить иконку из файла (image.loadFromFile("icon.png")) image.create(16, 16); for (int i = 0; i < 16; ++i) for (int j = 0; j < 16; ++j) image.setPixel(i, j, < (sf::Uint8) (i * 16), (sf::Uint8)(j * 16), 0 >); wnd.setIcon(image.getSize().x, image.getSize().y, image.getPixelsPtr()); >
