Использование OpenGL в SFML
Как вы знаете, одна из самых важных сторон OpenGL — переносимость на другие платформы. Но одного OpenGL недостаточно для создания завершенных приложений : вам потребуется окно, контекст рендеринга, пользовательский ввод, и так далее. У вас нету другого выбора, кроме как писать платформо-зависимый код для управления этими вещами. В этом месте модуль sfml-window выходит из тени. Давайте посмотрим, как он позволяет вам использовать OpenGL.
Включаем и линкуем OpenGL к вашему приложению
Заголовочные файлы OpenGL не одинаковы на разных операционных системах. Поэтому, SFML предоставляет «абстрактный» заголовочный файл, который позаботится о правильном подключении за вас.
#include
Этот заголовочный файл включает функции OpenGL и GLU, ничего более. Люди иногда думаю, что SFML автоматически подключает GLEW (библиотеку, которая дает управление над расширениями OpenGL), потому что SFML использует GLEW внутри, но это технические детали. Со стороны пользователя, GLEW должен быть подключен также, как остальные библиотеки расширений.
16 бит тому назад — Как появился OpenGL
Затем нам потребуется прилинковать к вашему приложению библиотеку OpenGL. К несчастью, такого же простого пути,как с заголовочными файлами, нету, и SFML не может предоставить общий принцип подключения OpenGL. Таким образом, вам нужно знать, какая библиотека прилинкована, в зависимости от используемой операционной системы («opengl32» в Windows, «GL» в Linux, и так далее). То же самое касается GLU, если вы хотите его использовать («glu32» в Windows, «GLU» в Linux, и так далее).
Функции OpenGL начинаются с префикса «gl», функции GLU начинаются с префикса «glu», Помните об это, когда будете получать ошибки при линковке — это поможет вам определить, какую библиотеку вы забыли прилинковать.
Создаем окно OpenGL
Так как SFML основан на OpenGL, его окна готовы для работы с функциями OpenGL безо всяких дополнительных действий.
Скопировать в буфер
sf::Window window(sf::VideoMode(800, 600), «OpenGL»); // это работает без каких-либо дополнительных действий glEnable(GL_TEXTURE_2D); .
В случае, если вы думаете, что это слишком автоматизировано, конструктор sf::Window имеет дополнительный аргумент , который позволяет изменить настройки основного контекста OpenGL. Этот аргумент — это экземпляр структуры sf::ContextSettings , который обеспечивает доступ к следующим настройкам :
depthBits — это количество битов на пиксель для использования в буфере глубины ( 0 , чтобы отключить его )
stencilBits — это количество бит на пиксель , чтобы использовать для буфера трафарета ( 0 , чтобы отключить его )
antialiasingLevel — это уровень мультисэмплинга
MajorVersion и MinorVersion содержат запрашиваемую версию OpenGL
Скопировать в буфер
sf::ContextSettings settings; settings.depthBits = 24; settings.stencilBits = 8; settings.antialiasingLevel = 4; settings.majorVersion = 3; settings.minorVersion = 0; sf::Window window(sf::VideoMode(800, 600), «OpenGL», sf::Style::Default, settings);
Если какие-либо из этих настроек не поддерживаются графической картой, SFML попытается найти ближайшее схожее значение. Например, если 4х-антиалиасинг не поддерживается, SFML попытается использовать 2х, а если и это не поможет, то такая функция будет попросту отключена.
Как решить проблему с OpenGL
В любом случае, вы можете проверить, какие настройки SFML использует в данный момент с помощью функции getSettings :
Скопировать в буфер
sf::ContextSettings settings = window.getSettings(); std::cout
OpenGL версии 3.0 и выше поддерживается в SFML (если поддерживается в драйвере видеокарты), но вы не сможете установить флаги на данный момент. Это означает, что вы не можете создать отладочный или совместимый контекст. На самом деле SFML автоматически создает контекст с «совместимыми» флагами, потому что он использует внутренние устаревшие функции. Это будет исправлено в ближайшее время и флаги будут выставлены также и в общественном API.
На OS X SFML поддерживается создание контекста OpenGL 3.2 используя профиль ядра. Помните, что эти контексты не совместимы с графическим модулем SFML. Если вы хотите использовать графический модуль, вам нужно использовать стандартный контекст с версией 2.1.
Типичное OpenGL-SFML приложение
Тут полный код минимального SFML приложения, использующего OpenGL :
Скопировать в буфер
#include #include int main() < // создаем окно sf::Window window(sf::VideoMode(800, 600), «OpenGL», sf::Style::Default, sf::ContextSettings(32)); window.setVerticalSyncEnabled(true); // загружаем ресурсы, инициализируем состояния OpenGL // запускаем главный цикл bool running = true; while (running) < // обрабатываем события sf::Event event; while (window.pollEvent(event)) < if (event.type == sf::Event::Closed) < // пора закрывать приложение running = false; >else if (event.type == sf::Event::Resized) < // применяем область просмотра, когда изменены размеры окна glViewport(0, 0, event.size.width, event.size.height); >> // очищаем буферы glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // рисуем // конец текущего кадра (меняем местами передний и задний буферы) window.display(); > // освобождаем ресурсы return 0; >
Здесь мы не используем window.isOpen() как условие в главном цикле, потому что нам нужно, чтобы окно оставалось открытым, пока приложение не закончит свою работу, поэтому у нас все еще будет к этому моменту валидный контекст OpenGL для последней итерации цикла и очистки ресурсов.
Не стесняйтесь посмотреть на примеры «OpenGL» и «Window» в SFML SDK, там вы увидите более развернутые объяснения, которые могут содержать ответы на ваши вопросы.
Управляем несколькими OpenGL окнами
Управление многими окнами OpenGL не намного сложнее, чем управление одним, здесь только стоит запомнить несколько важных вещей.
Вызовы OpenGL делаются в активном контексте (в активном окне). Таким образом, если вы хотите отрисовать два разных окна в одном приложении, вам нужно выбрать, какое окно будет активным, перед тем, как что-либо нарисовать. Для этого нужно использовать функцию setActive :
Скопировать в буфер
// активируем первое окно window1.setActive(true); // рисуем первое окно // активируем второе окно window2.setActive(true); // рисуем второе окно
Только один контекст (окно) может быть активно в потоке, поэтому вам не нужно деактивировать окно перед активацией другого, оно деактивируется автоматически. Таким образом работает OpenGL.
Другая вещь, которую нужно знать о контекстах OpenGL, созданных с помощью SFML — это разделение их ресурсов. Это значит, что вам не нужно перезагружать все ваши ресурсы OpenGL, когда вы пересоздаете окно. Только общие ресурсы OpenGL могут быть разделены между контекстами. Пример неразделяемого ресурса — буфер вершин.
OpenGL без окна
Иногда требуется вызвать функции OpenGL без активного окна и, соответственно, без контекста. Например, когда вы загружаете текстуры из разных потоков или перед тем, как первое из окон будет создано. SFML позволяет создавать полу-контекстные окна с помощью класса sf::Context. Все, что вам нужно сделать, это создать его экземпляр, чтобы получить правильный контекст.
Скопировать в буфер
int main() < sf::Context context; // загружаем ресурсы OpenGL sf::Window window(sf::VideoMode(800, 600), «OpenGL»); . return 0; >
Рисование в потоках
Типичное использование многопоточных приложений — это управление окном и его событиями в одном потоке (главном), и рисование в другом. Если вы так делаете, вам нужно кое-что запомнить : вы не можете активировать контекст (окно), если оно активировано в другом потоке. Это значит, что вам нужно деактивировать ваше окно перед запуском потока отрисовки.
Скопировать в буфер
void renderingThread(sf::Window* window) < // активируем контекст окна window->setActive(true); // цикл отрисовки while (window->isOpen()) < // рисуем // конец текущего кадра — здесь функция отрисовки(требует контекст) window->display(); > > int main() < // создаем окно sf::Window window(sf::VideoMode(800, 600), «OpenGL»); // деактивируем его контексты OpenGL window.setActive(false); // запускаем поток отрисовки sf::Thread thread(window); thread.Launch(); // цикл событийлогикичего-либо еще while (window.isOpen()) < . >return 0; >
Использование OpenGL вместе с графическим модулем SFML
В этой статье описывается совместное использование OpenGL с модулем sfml-window, это очень легко, так как это единственная цель этого модуля. Использование совместно с графическим модулем немного сложнее : sfml-graphics тоже использует OpenGL, поэтому требуется усиленное внимание, чтобы состояния, заданные пользователем и внутри SFML не конфликтовали между собой.
Если вы еще не изучили графический модуль, то вам следует знать, что класс sf::Window заменен классом sf::RenderWindow, который содержит все его функции и добавляет функционал для отрисовки специальных сущностей SFML.
Единственный путь избежать конфликтов между состояниями SFML и вашими состояниями OpenGL — это сохранениевосстановление их каждый раз, когда вы переключаетесь между SFML и OpenGL.
Скопировать в буфер
— draw with OpenGL — save OpenGL states — draw with SFML — restore OpenGL states — draw with OpenGL .
Простое решение — это позволить SFML делать это за вас,с помощью функций pushGLStates/popGLStates :
Скопировать в буфер
glDraw. window.pushGLStates(); window.draw(. ); window.popGLStates(); glDraw.
Так как SFML не знает всё о вашем коде OpenGL, он не может оптимизировать все шаги и в результате сохраняетзагружает все доступные состояния и матрицы OpenGL. Это может быть приемлемо для небольших проектов, но может существенно замедлять работу больших приложений, которые требуют максимальной производительности. В этом случае, вы можете управлять сохранением и загрузкой состояний OpenGL вручную, с помощью glPushAttrib/glPopAttrib, glPushMatrix/glPopMatrix, и так далее.
Если вы будете это делать, вам не нужно восстанавливать состояния SFML перед отрисовкой. Это будет сделано с помощью функции resetGLStates.
Скопировать в буфер
glDraw. glPush. window.resetGLStates(); window.draw(. ); glPop. glDraw.
Сохраняя и загружая состояния OpenGL собственноручно, вы можете использовать только те, которые вам реально необходимы, для снижения лишних вызовов драйвера.
Источник: xgm.guru
Как добавить параметр строки, например, -opengl в World of Warcraft в PlayOnLinux?
Подождите. Задержка заключается не в том, что она «висит», а скорее в том, что она выполняет работу.
Система сначала проверит сжатие / перемещение раздела. Это требует времени. Когда он действительно изменяет размеры и перемещает данные, это также требует времени. Кроме того, когда вы изменяете размер, Windows может на самом деле кричать на вас.
задан RolandiXor 16 October 2011 в 04:27
4 ответа
Перейдите в свою папку с винчестером World of Warcraft, перейдите в папку WTF, а затем отредактируйте файл config.wtf и добавьте эту строку в конец (или измените ее, если она уже существует): SET gxApi «opengl».
Это заставит ваш wow.exe использовать opengl каждый раз, когда вы его запускаете.
ответ дан Bruno Pereira 25 May 2018 в 18:07
Отлично, большое спасибо !. Но я не решил свою проблему 🙁 Я хочу исправить эти пикселированные деревья: i54.tinypic.com/ih76fq.png — Однако вы решили этот конкретный вопрос, поэтому я Примите этот ответ = P. Спасибо. – Zrakk 16 October 2011 в 00:15
Я могу помочь вам в этом 🙂 Можете ли вы попытаться запустить то же самое на ubuntu-2d и сказать мне, если что-нибудь изменится? Знание вашей видеокарты было бы неплохо. – Bruno Pereira 16 October 2011 в 00:22
Чувак, ты гений. Я попытался перейти на Ubuntu-2d LOGGING OUT и не исправил его. Но я недавно попробовал RESTARTING мой ноутбук и использовал ту же сессию Ubuntu-2d и WORKS !. Большое вам спасибо. – Zrakk 16 October 2011 в 00:36
wlcm, рад помочь! ДЛЯ ВЗРОСЛЫХ . – Bruno Pereira 16 October 2011 в 00:36
Очень полезно! Другой способ — создать ключ DWORD в CURRENT_USER / Software / Blizzard / Warcraft с именем «Afx OpenGL». и установите значение 1. – Emerald214 19 February 2012 в 00:08
Источник: askubuntu.ru
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» и «Как посмотреть параметры видеокарты». Буду признателен, если вы расшарите этот пост в социальных сетях. До скорой встречи!
С уважением, автор блога Андрей Андреев.
Источник: infotechnica.ru