Sfml как подключить opengl

Using OpenGL in a SFML window


This tutorial is not about OpenGL itself, but rather how to use SFML as an environment for OpenGL, and how to mix them together.

As you know, one of the most important features of OpenGL is portability. But OpenGL alone won’t be enough to create complete programs: you need a window, a rendering context, user input, etc. You would have no choice but to write OS-specific code to handle this stuff on your own. That’s where the sfml-window module comes into play. Let’s see how it allows you to play with OpenGL.

Including and linking OpenGL to your application

OpenGL headers are not the same on every OS. Therefore, SFML provides an «abstract» header that takes care of including the right file for you.

This header includes OpenGL functions, and nothing else. People sometimes think that SFML automatically includes OpenGL extension headers because SFML loads extensions itself, but it’s an implementation detail. From the user’s point of view, OpenGL extension loading must be handled like any other external library.

You will then need to link your program to the OpenGL library. Unlike what it does with the headers, SFML can’t provide a unified way of linking OpenGL. Therefore, you need to know which library to link to according to what operating system you’re using («opengl32» on Windows, «GL» on Linux, etc.).

OpenGL functions start with the «gl» prefix. Remember this when you get linker errors, it will help you find which library you forgot to link.

Creating an OpenGL window

Since SFML is based on OpenGL, its windows are ready for OpenGL calls without any extra effort.

In case you think it is too automatic, sf::Window ‘s constructor has an extra argument that allows you to change the settings of the underlying OpenGL context. This argument is an instance of the sf::ContextSettings structure, it provides access to the following settings:

If any of these settings is not supported by the graphics card, SFML tries to find the closest valid match. For example, if 4x anti-aliasing is too high, it tries 2x and then falls back to 0.
In any case, you can check what settings SFML actually used with the getSettings function:

OpenGL versions above 3.0 are supported by SFML (as long as your graphics driver can handle them). Support for selecting the profile of 3.2+ contexts and whether the context debug flag is set was added in SFML 2.3. The forward compatibility flag is not supported. By default, SFML creates 3.2+ contexts using the compatibility profile because the graphics module makes use of legacy OpenGL functionality. If you intend on using the graphics module, make sure to create your context without the core profile setting or the graphics module will not function correctly. On OS X, SFML supports creating OpenGL 3.2+ contexts using the core profile only. If you want to use the graphics module on OS X, you are limited to using a legacy context which implies OpenGL version 2.1.

A typical OpenGL-with-SFML program

Here is what a complete OpenGL program would look like with SFML:

Here we don’t use window.isOpen() as the condition of the main loop, because we need the window to remain open until the program ends, so that we still have a valid OpenGL context for the last iteration of the loop and the cleanup code.

Don’t hesitate to have a look at the «OpenGL» and «Window» examples in the SFML SDK if you have further problems, they are more complete and most likely contain solutions to your problems.

Managing OpenGL contexts

Every window created in SFML automatically comes with an OpenGL context. When calling any OpenGL functions, they operate on the currently active context. It is thus required that a context be active any time OpenGL functions are called. If a context is not active when an OpenGL function is called, the function call will not result in the desired effects since there is no state for it to have an effect on.

Читайте также:  Как подключить двухклавишный выключатель без заземления

When debugging issues with OpenGL in SFML, the first step is always to make sure a context is active when OpenGL functions are called. Do not assume that SFML will implicitly activate a context or that SFML will preserve the currently active context when calling into the library. The only guarantee provided is that the context active on the current thread will not change between calls to window.setActive(true) and window.setActive(false) as long as no other calls are made into the library in between. In all other cases, it has to be assumed that the current context might have changed, so explicitly reactivating the previously active context is required to guarantee the previously active context is once again active. Also ensure that the right context is active when an OpenGL function is called. The active context not only provides an execution environment for OpenGL operations, it also designates the destination framebuffer of any draw commands. Calling OpenGL draw functions while a context without a visible framebuffer is active will result in those draw commands not producing any visible output. Splitting OpenGL operations among multiple contexts will also result in the state changes being spread across the contexts. If any subsequent draw operation assumes that certain states are set, it will not produce the correct results in this case.

A highly recommended practice when writing OpenGL code is to always check if any OpenGL errors were produced after every OpenGL function call. This is done via the glGetError() function. Checking for errors after every function call will help to narrow down where a possible error might have occurred and improve debugging efficiency significantly.

Depending on the version and capabilities of the context available, care has to be taken to only call functions that are actually valid within the current context. Doing otherwise will often result in the GL_INVALID_OPERATION or GL_INVALID_ENUM errors being generated. To query the actual version and capabilities of a context created with a window or separately, use window.getSettings() or context.getSettings() respectively. Be aware that these settings might differ from the settings passed during creation of the context if the OpenGL implementation was not able to meet all the requirements. It is recommended to always check if the context created actually provides the functionality required by the OpenGL code to be executed. This can become confusing when loading OpenGL extensions in a more capable context and trying to use them in a less capable context or vice versa.

Managing multiple OpenGL windows

Managing multiple OpenGL windows is not more complicated than managing one, there are just a few things to keep in mind.

OpenGL calls are made on the active context (thus the active window). Therefore if you want to draw to two different windows within the same program, you have to select which window is active before drawing something. This can be done with the setActive function:

Only one context (window) can be active in a thread, so you don’t need to deactivate a window before activating another one, it is deactivated automatically. This is how OpenGL works.

Another thing to know is that all the OpenGL contexts created by SFML share their resources. This means that you can create a texture or vertex buffer with any context active, and use it with any other. This also means that you don’t have to reload all your OpenGL resources when you recreate your window. Only shareable OpenGL resources can be shared among contexts. An example of an unshareable resource is a vertex array object.

OpenGL without a window

Sometimes it might be necessary to call OpenGL functions without an active window, and thus no OpenGL context. For example, when you load textures from a separate thread, or before the first window is created. SFML allows you to create window-less contexts with the sf::Context class. All you have to do is instantiate it to get a valid context.

Читайте также:  Как подключить openserver к phpstorm

Rendering from threads

A typical configuration for a multi-threaded program is to handle the window and its events in one thread (the main one), and rendering in another one. If you do so, there’s an important rule to keep in mind: you can’t activate a context (window) if it’s active in another thread. This means that you have to deactivate your window before launching the rendering thread.

Using OpenGL together with the graphics module

This tutorial was about mixing OpenGL with sfml-window, which is fairly easy since it’s the only purpose of this module. Mixing with the graphics module is a little more complicated: sfml-graphics uses OpenGL too, so extra care must be taken so that SFML and user states don’t conflict with each other.

The only way to avoid conflicts between SFML and your own OpenGL states, is to save/restore them every time you switch from OpenGL to SFML.

The easiest solution is to let SFML do it for you, with the pushGLStates / popGLStates functions :

By saving and restoring OpenGL states yourself, you can manage only the ones that you really need which leads to reducing the number of unnecessary driver calls.


Вступление и установка графической библиотеки SFML в C++

Обновл. 19 Ноя 2020 |

Пссс, парень! Не хочешь попробовать немного SFML? Убойная штука. Достаточно самой малости и с её помощью ты сможешь воплотить в жизнь то, о чем раньше мог только мечтать. Тебе понравится, гарантирую. Тем более тебе, как новичку, первая порция бесплатно, я угощаю. Ну что, договорились? Тогда по рукам.


«Что же из себя представляет SFML?» — спросите вы.

С её помощью можно легко и непринужденно создавать любую 2D-графику: начиная от простейших одиночных геометрических фигур (типа треугольника) и заканчивая полноценными играми-платформерами.

Исходный код библиотеки предоставляется под лицензией zlib/png, а скачать SFML можно с оф. сайта разработчика www.sfml-dev.org.

Что нужно для начала?

Все примеры этого урока были сделаны мной в ОС Windows 7 с использованием IDE MS Visual Studio 2017 Community Edition и библиотеки SFML 2.5.1.

Ну что, парень, ты готов? Да вижу, что готов. Погнали!

Установка библиотеки SFML

Я не буду рассказывать, как установить Visual Studio, а перейду сразу к SFML. Для того, чтобы установить библиотеку, нужно зайти на сайт www.sfml-dev.org и перейти в пункт меню «Download» и скачать «SFML 2.5.1»:

Как уже писалось выше, в качестве IDE я буду использовать Visual Studio 2017, поэтому скачиваем соответствующую версию SFML. Вы также можете заметить наличие готового пакета для эстетов Code Blocks. Помимо этого, в глаза бросаются варианты библиотеки для других версий Visual Studio. Сразу дам совет — не пытайтесь лепить Франкенштейна, используя неподходящий билд SFML, иначе вы рискуете получить вагон и маленькую тележку всякого рода проблем на свою голову.

Теперь, когда у нас есть проект, нужно добавить в него файл, который будет содержать исходный код нашей программы. Для этого в окне «Обозреватель решений» клацните ПКМ по строке «Исходные файлы» > «Добавить» > «Создать элемент…» :

В поле «Имя» укажите main.cpp :

Отлично! Следующим шагом будет подключение библиотеки SFML к нашему проекту. Для этого нужно:

подключить каталог заголовочных и исходных файлов SFML ( /include );

подключить каталог библиотечных файлов SFML ( /lib );

подключить библиотечные файлы SFML в качестве дополнительных зависимостей.

Переходим в «Проект» > «Свойства: SFML_Tutorial…» :


Должно получиться следующее:

Первые шаги и первые…

На этом этапе подключение библиотеки SFML к проекту завершено, и мы можем перейти к непосредственному написанию кода для нашей первой программы. Ниже представлен минимальный каркас приложения:

Я вижу, как ваша рука уже потянулась к кнопке «Скомпилировать и запустить проект», но не торопитесь, давайте сначала разберем данный код:

Строка №8: Создаем объект window класса RenderWindow. Данный объект — это наше окно, в котором будет отображаться 2D-графика. Первый параметр VideoMode(200, 200) задает видеоразрешение окна (ширину и высоту). Второй параметр «SFML Works!» — это заголовок окна.

Далее идут 2 цикла while: внешний (строка №11) и внутренний (строка №15). Сложного здесь ничего нет. SFML предлагает удобные средства для работы с событиями. Именно их мы и будем использовать для создания цикла работы приложения и обработки событий окна. Во внешнем цикле while при помощи метода isOpen() мы проверяем, открыто ли наше окно в данный момент. Во внутреннем цикле while метод pollEvent(event) перебирает очередь событий (сообщений), которые возникают в нашем окне.

Читайте также:  Как подключить wifi на телефоне леново а536

Очередь может содержать любое количество сообщений, именно по этой причине мы и используем цикл: чтобы перебрать их все. Предположим, например, что пользователь перемещает курсор во время выполнения нашей программы или нажимает на какие-то объекты. SFML обнаружит это и поместит два события в очередь: одно на перемещение курсора и одно на нажатие на объект. Выбрать определенное сообщение из очереди можно с помощью метода pollEvent() класса RenderWindow. Так вот, если какое-то событие из этой очереди совпадает с Event::Closed (т.е. пользователь нажал на крестик, тем самым послав сигнал «Закрыть окно»), то при помощи windows.close() мы закрываем окно. По сути, этот цикл бесконечен и выход из него только один — закрыть окно программы.

В строке №23 мы вызываем метод display(), который отвечает за отрисовку нашего окна.

Вот теперь можно перейти к компиляции и первому запуску программы. Для этого нажмите в Visual Studio «Отладка» > «Запуск без отладки» (или Ctrl+F5 ). Ииии, вот и она! Ваша первая… ЧТО…. ОШИБКА…. WTF….

«Что за хрень. » — спросите вы. Столько времени потрачено на ковыряние, настройку и прочее ради вот этого вот?! Долбанного окна с ошибкой?! Нафиг всё, дизлайк/отписка, го даст2 я создал.

Попробуйте теперь скомпилировать и запустить проект. В результате должно получиться следующее:


Подключение библиотеки SFML к Visual Studio

В этом уроке я хотел бы показать, как подключить библиотеку SFML к среде разработки Visual Studio.

SFML содержит ряд модулей для простого программирования игр и мультимедиа приложений.

Перед тем как начать. Нужно пройти по ссылке: http://www.sfml-dev.org/download/sfml/2.3.2/ (это официальный сайт) и скачать библиотеку. Выбирайте версию для своей VS.

Распаковываем куда вам угодно, на всякий случай старайтесь избегать русских букв в папках пути.

Запускаем Visual Studio, файл->создать->проект->пустой проект. (Имя проекта, решений и путь выбирайте сами).

Добавляем исходный код – для этого слева в обозревателе решений находим вкладку «Файлы исходного кода»->правый клик->добавить->создать элемент->файл C++ (имя main.cpp)->добавить.

Далее вставляем вот этот тестовый код в файл main.cpp

После попытки запуска мы сталкиваемся с подобной проблемой:

Для того, чтобы всё это работало – необходимо подключить библиотеку SFML.

Для начала, все действия мы делаем для конфигурации Debug.

Заходим вверху «проект»->свойства “имя проекта”->свойства конфигурации->C++->общие

В пункте «дополнительные каталоги включаемых файлов прописываем путь до раннее распакованного архива с библиотекой (+ \include.)

Например: C:\Program Files\SFML-2.3.2\include

Затем идем в компоновщик->общие и в пункте «дополнительные каталоги библиотек» прописываем путь к папке lib;

Далее идем в компоновщике во вкладку ввод и в первой строке «дополнительные зависимости» вписываем перед всеми библиотеками следующую строчку:


Только что подключили основные необходимые для работы библиотеки.

Последний штрих – идем во вкладку C++->препроцессор и в первой строке «определение препроцессора» в самом начале дописываем: SFML_DYNAMIC;

Напоминаю, все действия мы делали для конфигурации Debug. Все тоже самое нужно проделать для конфигурации Release.
Заходим вверху «проект»->свойства “имя проекта”->свойства конфигурации. В левом верхнем углу находим Конфигурация, нажимаем на слайдер и выбираем Release.
И повторяем несколько предыдущих пунктов.

Запустим и словим ошибку. Зато соберется проект и появится папка debug.

Теперь идем в папку бинарников “bin”, которую вы скачали и распаковали с библиотекой (мой вариант D:\SFML-2.2\bin\) и копируем всё содержимое этой папки (dll файлы типа sfml-graphics-2.dll) в папку с вашим проектом в папку debug (после сборки появилась эта папка), но не в тот debug, где лежит файл с исходным кодом “main.cpp”, а тот, где появляется exe файл.

В эту же папку копируем и вот эти файлы :

Все эти файлы можно скачать в zip архиве, который я прикрепил снизу.

Теперь проект можно запустить и если вы всё сделали правильно, то увидите зелёный круг как на скриншоте ниже:

Если возникла вот такая проблема:

Советую воспользоваться программой: Dll-Files Fixer.